我们正在使用maven和surefire 2.19进行Junit 4.11测试。当我们使用IDE或命令行运行时,我们看不到任何故障。然而,当使用Jenkins时,间歇性地进行几次测试将失败验证静态断言。
这是一个片段:
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清理后重现这个问题,似乎是在干净后第一次运行。
对不起,我骗了。 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方法。
答案 0 :(得分:0)
将以下代码添加到测试开头:
PowerMockito.mockStatic(AClass.class);
答案 1 :(得分:0)
无法告诉你究竟是什么问题;将surefire从2.17升级到2.18时遇到了类似的问题。
我或许可以提供一种解决方法:正如surefire documentation中所建议的那样,我将@NotThreadSafe
添加到使用PowerMockito的测试中 - 这是为我做的。
答案 2 :(得分:0)
不知何故,使用powermock的测试会遇到间歇性故障。虽然很难远离这些基于CG lib的模拟库,但我的团队选择了easymock,这在很大程度上降低了我们的生产力。