【发布时间】:2020-09-06 13:32:23
【问题描述】:
我有一个简单的带有 AWS SQS 集成的 Spring Boot 应用程序。 在集成测试中,我试图监视使用 @SqsListener 注释注释的方法,并得到一个 bean sometimes 没有被监视的行为。
您可以在这里查看示例项目:https://github.com/Sanych/aws-sqs-spybean-troubleshooting
运行mvn clean verify
在此日志中,人们可能会注意到,3 种测试方法中有 2 种被成功监视:
2020-09-06 15:39:23.597 INFO 18372 --- [ main] com.aws.test.demo.SQSListenerIT : Started SQSListenerIT in 0.813 seconds (JVM running for 24.024)
2020-09-06 15:39:23.604 WARN 18372 --- [ main] com.aws.test.demo.SQSListenerIT : calling class com.aws.test.demo.SQSListener$MockitoMock$1506819983
2020-09-06 15:39:23.604 WARN 18372 --- [ main] com.aws.test.demo.SQSListenerIT : sendMessage to queue: test 1
2020-09-06 15:39:23.810 WARN 18372 --- [enerContainer-2] com.aws.test.demo.SQSListener : id: class com.aws.test.demo.SQSListener$MockitoMock$1506819983, received: 'test 1'
2020-09-06 15:39:23.929 WARN 18372 --- [ main] com.aws.test.demo.SQSListenerIT : calling class com.aws.test.demo.SQSListener$MockitoMock$1506819983
2020-09-06 15:39:23.929 WARN 18372 --- [ main] com.aws.test.demo.SQSListenerIT : sendMessage to queue: test 2
2020-09-06 15:39:24.052 WARN 18372 --- [enerContainer-2] com.aws.test.demo.SQSListener : id: class com.aws.test.demo.SQSListener, received: 'test 2'
2020-09-06 15:39:29.148 WARN 18372 --- [ main] com.aws.test.demo.SQSListenerIT : calling class com.aws.test.demo.SQSListener$MockitoMock$1506819983
2020-09-06 15:39:29.148 WARN 18372 --- [ main] com.aws.test.demo.SQSListenerIT : sendMessage to queue: test 3
2020-09-06 15:39:29.175 WARN 18372 --- [enerContainer-2] com.aws.test.demo.SQSListener : id: class com.aws.test.demo.SQSListener$MockitoMock$1506819983, received: 'test 3'
[ERROR] Tests run: 3, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 6.468 s <<< FAILURE! - in com.aws.test.demo.SQSListenerIT
[ERROR] test2 Time elapsed: 5.218 s <<< ERROR!
org.awaitility.core.ConditionTimeoutException:
Assertion condition defined as a lambda expression in com.aws.test.demo.SQSListenerIT
Wanted but not invoked:
SQSListener.listen(<any string>);
-> at com.aws.test.demo.SQSListenerIT.lambda$sendMessageFromFileAndWaitForListenerToRead$0(SQSListenerIT.java:57)
Actually, there were zero interactions with this mock.
within 5 seconds.
at com.aws.test.demo.SQSListenerIT.sendMessageFromFileAndWaitForListenerToRead(SQSListenerIT.java:57)
at com.aws.test.demo.SQSListenerIT.test2(SQSListenerIT.java:42)
Caused by: org.mockito.exceptions.verification.WantedButNotInvoked:
Wanted but not invoked:
SQSListener.listen(<any string>);
-> at com.aws.test.demo.SQSListenerIT.lambda$sendMessageFromFileAndWaitForListenerToRead$0(SQSListenerIT.java:57)
Actually, there were zero interactions with this mock.
at com.aws.test.demo.SQSListenerIT.lambda$sendMessageFromFileAndWaitForListenerToRead$0(SQSListenerIT.java:57)
我错过了什么吗?
【问题讨论】:
-
我猜从你的日志来看,SQSListener 没有被触发。未调用意味着您等待一段时间但未调用。你能分享你的测试吗?
-
另外,您不需要测试 sqs 侦听器,因为您正在测试注释。您可以编写单元测试,但它有点奇怪。对于每个 IT 测试,您都需要付出代价 :)
-
@Gurkanİlleez 代码示例位于 git repo github.com/Sanych/aws-sqs-spybean-troubleshooting
-
我遇到了一个非常相似的问题。您是否设法找到任何解决此问题的方法?
标签: java spring-boot junit amazon-sqs