У меня есть приложение для весенней загрузки, которое не более чем прослушивает очередь SQS через компонент «MessageHandler», у которого есть метод с аннотациями @ SqsListener, и начинает некоторую работу, когда приходит сообщение.
Также существует зависимость boot-starter-web, поскольку мы хотим получать статус работоспособности и метрики через http в производственной среде.
Теперь я хотел написать тест модуля, в котором уже есть контекст приложения и компоненты autowires. Я также узнал, как отключить веб-сервер, который не нужен тесту:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
Однако bean-компонент MessageHandler также создается и пытается подключиться к AWS, чего я бы хотел предотвратить.
Одно из эффективных решений - иметь тестовую реализацию в src / test / java с аннотацией @Primary, чей метод handleMessage НЕ имеет аннотации @SqsListener:
@Component
@Primary
public class TestMessageHandler implements MessageHandler {
@Override
public void handleMessage(final NewMessage newMessage) throws Exception {
return null;
}
}
Но теперь я хотел бы также протестировать (настоящий) bean-компонент MessageHandler, то есть я бы хотел, чтобы Spring создал его экземпляр и автоматически связал его зависимости, но я все еще не хочу, чтобы аннотации @SqsListener становились активными, поэтому я могу вызвать в моем тесте это было так:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
public class IntegrationTest {
@Autowired
private RealMessageHandler messageHandler;
@Test
public void testHandleMessage() throws Exception {
messageHandler.handleMessage(new NewMessage(...));
}
}
Итак, мне нужно отключить магию модуля spring-cloud-aws-starter, который устанавливает прослушиватель SQS для метода handleMessage в RealMessageHandler.
Есть какие-нибудь подсказки, как бы я это сделал?