Код: Выделить всё
@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
}
}
Я попытался внедрить компонент 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
Мобильная версия