【发布时间】:2016-02-26 01:59:59
【问题描述】:
我们使用 maven 和 surefire 2.19 进行 Junit 4.11 测试。当我们使用 IDE 或从命令行运行时,我们看不到任何失败。然而,在使用 Jenkins 时,我们的一些测试会间歇性地导致 verifyStatic 断言失败。
这是一个sn-p:
verifyStatic(times(1));
AClass.someStaticMethod(aUrl);
surefire 有时会报告:
[java] Failed tests:
[java] AClass.someStaticMethod:55
[java] Wanted but not invoked AClass.someStaticMethod(
[java] "http://foo.com/artwork.png"
[java] );
[java] Actually, there were zero interactions with this mock.
我已经厌倦了在测试中使用单线程,认为这就是我们的 IDE 正在做的事情,但这并没有帮助:
<reuseForks>false</reuseForks>
<forkCount>1</forkCount>
对可能发生的情况以及如何解决有任何建议吗?
更新:
我在此测试运行之前调用 mockStatic(AClass.class)。
另外,我已经能够通过设置一个 while 循环在命令行上重现这一点。
while [ $? -eq 0 ]; do ./mvnvm -T 8 clean && \
./mvnvm -T 8 -b multithreaded -am -Dtest=AClassTests \
-DfailIfNoTests=false -Dmaven.test.skip=false -pl MyProject test; done
最终在这个循环中我会让测试失败。现在我必须弄清楚如何在故障发生之前检测到故障并附加一个调试器。
更新 2:
我可以在 maven clean 后轻松重现此问题,似乎在 clean 后第一次运行时发生。
对不起,我撒谎了。 Thread.sleep 对此没有影响。
更新 3:
根据更新 2,Thread.sleep 无效。
Arthor,这里还有一点代码:
PowerMockito.mockStatic(ImageUtil.class);
Mockito.when(ImageUtil.getImageDetail(imageUrl)).thenReturn(detail);
ValidationCommand command = new ValidationCommand();
command.execute(validationContext);
Thread.sleep(1000);
PowerMockito.verifyStatic(times(1));
ImageUtil.getImageDetail(imageUrl);
command.execute 将在其正常执行过程中调用 ImageUtil.getImageDetail 方法。
【问题讨论】:
-
您好!你能提供更多关于你的静态方法做什么的细节吗?它在哪里调用?你把'Thread.sleep'放在哪里了?在“验证静态”之前?还是之后?
标签: java maven jenkins powermock surefire