springs@mockbean并不总是被使用

cwtwac6a  于 2021-07-16  发布在  Java
关注(0)|答案(0)|浏览(221)

我试图通过使用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)进行测试
谢谢你的提示

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题