@MockBean использует другой экземпляр в прослушивателе JMS при запуске нескольких тестов Spring Boot.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 @MockBean использует другой экземпляр в прослушивателе JMS при запуске нескольких тестов Spring Boot.

Сообщение Anonymous »

Я написал Spring Boot Test, который записывает данные в очередь JMS и ожидает некоторой обработки через прослушиватель JMS. В прослушивателе я пытаюсь прочитать объект из S3. Класс AmazonS3 следует заменить MockBean. В своем тесте я настроил макет следующим образом:

Код: Выделить всё

@SpringBootTest
public class MyTest {

@Autowired
MyJmsPublisher jmsPlublisher;
@MockBean
AmazonS3 amazonS3;

@Test
public void test() {
final S3Object s3Object = mock(S3Object.class);
when(s3Object.getObjectContent()).thenReturn(mock(S3ObjectInputStream.class));
when(amazonS3.getObject(anyString(), anyString())).thenReturn(s3Object);

jmsPlublisher.publishMessage("mymessage");
Awaitility.await().untilAsserted(() -> {
//wait for something here
});
}
}

@Component
@RequiredArgsConstructor
public class MyJmsPublisher {

private final JmsTemplate jmsTemplate;

public void publishMessage(String message) {
jmsTemplate.convertAndSend("destination", message);
}
}

@Component
@RequiredArgsConstructor
public class MyJmsListener {

private final AmazonS3 amazonS3;

@JmsListener(destination = "destination")
public void onMessageReceived(String message) {
final S3ObjectInputStream objectContent = amazonS3.getObject("a", "b").getObjectContent();
// some logic here
}
}

Но проблема в том, что при запуске нескольких тестов Spring Boot класс MyJmsListener содержит макет, отличный от созданного в тесте. Это шутка, но, например, getObjectContent() возвращает значение null. Но, когда я запускаю тест в одиночку, все работает нормально.
Я попытался внедрить компонент AmazonS3 в MyJmsPublisher и вызвать там имитируемый метод, и это сработало. Поэтому я подозреваю, что это связано с тем, что прослушиватель JMS работает в другом потоке.
Я нашел этот поток и также установил сброс для всех доступных параметров, но это не имеет никакого значения. Я также попробовал подход этого ОП, который сработал для них, где я создал макет с помощью аннотации @Bean следующим образом:

Код: Выделить всё

@Configuration
public class MyConfig {
@Bean
@Primary
public AmazonS3 amazonS3() {
return Mockito.mock(AmazonS3.class);
}
}
Но это имеет то же поведение, что и упомянутое выше.
Так можно ли на самом деле использовать аннотацию @MockBean при использовании разных потоков, например при использовании @JMSListener? Или я что-то упускаю?

Подробнее здесь: https://stackoverflow.com/questions/680 ... e-spring-b
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»