Ber*_*ard 4 spring-cloud-aws spring-boot-test
我有一个 Spring Boot 应用程序,它只不过是通过具有 @SqsListener 注释方法的组件“MessageHandler”侦听 SQS 队列,并在消息到达时开始一些工作。
还有一个 boot-starter-web 依赖项,因为我们希望在生产中通过 http 获取健康状态和指标。
现在我想编写一个模块测试,它已经有一个应用程序上下文和自动装配 bean。我还发现了如何禁用测试不需要的 Web 服务器:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = NONE)
Run Code Online (Sandbox Code Playgroud)
但是,MessageHandler bean 也会被实例化并尝试连接到 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在我还想测试(真实的)MessageHandler bean,这意味着我希望 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(...));
}
}
Run Code Online (Sandbox Code Playgroud)
所以我需要的是关闭 spring-cloud-aws-starter 模块的魔法,该模块为 RealMessageHandler 中的 handleMessage 方法设置 SQS 侦听器。
任何线索我会怎么做?
我有一个类似的问题,并通过模拟 SimpleMessageListenerContainer bean 解决了它。我计划为多个集成测试执行此操作,以便这些测试更具可读性,我创建了一个 @TestConfiguration 类,然后将其导入到测试中。
这是我的配置类:
/**
* Configuration class for integration test that do not need message listening capabilities.
*/
@TestConfiguration
public class MockMessageListenerConfiguration {
@MockBean
private SimpleMessageListenerContainer messageListenerContainer;
}
Run Code Online (Sandbox Code Playgroud)
我像这样使用它:
@SpringBootTest
@Import({MockMessageListenerConfiguration.class})
class BookingRepositoryIT {...}
Run Code Online (Sandbox Code Playgroud)
此后,与 AWS SQS 相关的连接拒绝警告消失了。
| 归档时间: |
|
| 查看次数: |
2975 次 |
| 最近记录: |