surefire,PowerMock和verifyStatic间歇性故障

时间:2016-02-26 01:59:59

标签: java maven jenkins powermock surefire

我们正在使用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方法。

3 个答案:

答案 0 :(得分:0)

将以下代码添加到测试开头:

PowerMockito.mockStatic(AClass.class);

答案 1 :(得分:0)

无法告诉你究竟是什么问题;将surefire从2.17升级到2.18时遇到了类似的问题。

我或许可以提供一种解决方法:正如surefire documentation中所建议的那样,我将@NotThreadSafe添加到使用PowerMockito的测试中 - 这是为我做的。

答案 2 :(得分:0)

不知何故,使用powermock的测试会遇到间歇性故障。虽然很难远离这些基于CG lib的模拟库,但我的团队选择了easymock,这在很大程度上降低了我们的生产力。