我试图通过使用spring云aws消息传递测试spring引导应用程序是否正确地从aws sqs队列接收消息。
侦听器:
@Component
public class RequestListener {
private static final Logger LOG = LoggerFactory.getLogger(RequestListener.class);
private final MyService myService;
public RequestListener(MyService myService) {
this.myService = myService;
}
@SqsListener(value = "${aws.queue.url}", deletionPolicy = SqsMessageDeletionPolicy.ALWAYS)
void getRequest(MyRequest request) {
LOG.info("Fetched new message from SQS: {}", request);
myService.processRequest(request);
}
}
测试:
@ExtendWith(SpringExtension.class)
@ActiveProfiles(SpringProfiles.TEST)
@SpringBootTest(webEnvironment = RANDOM_PORT)
class TestClass {
...
@MockBean
MyService myService;
@Test
void testReceiveMessage() {
var payload = MyRequest.builder().content("foo").build();
messagingTemplate.convertAndSend(testQueueUrl, payload);
when(myService.processRequest(payload)).thenReturn(true);
verify(myService, Mockito.timeout(2000).atLeastOnce()).processRequest(payload);
}
...
每次都会收到消息(我看到日志),但验证失败的可能性为50%,因为模拟从未调用过(错误:零交互)。我最初认为这可能是一些同步问题(因此超时),但实际上我可以看到 MyService
每当测试失败时,调用服务而不是模拟。
我使用 mvn clean install
所以我的问题是,怎么可能有时模拟有时真实的对象被调用?
我还尝试用一个自定义的 @Profile
但是这也没有改变行为。
使用BootVersion2.3.9.release和SpringCloudHoxton.sr10(以及BootVersion2.4.1和cloud版本hoxton.sr10)进行测试
谢谢你的提示
暂无答案!
目前还没有任何答案,快来回答吧!