2016-02-26 151 views
1

我们使用maven和surefire 2.19进行Junit 4.11测试。当我们使用我们的IDE或命令行运行时,我们没有看到任何故障。但是在间歇性地使用Jenkins时,我们的一些测试会失败verifyStatic断言。surefire,PowerMock和verifyStatic间歇性故障

这里有一个片段:

verifyStatic(times(1)); 
AClass.someStaticMethod(aUrl); 

神火有时会报告:

[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:

我可以很容易地重现干净行家之后这个问题,似乎干净后发生的第一次运行。

对不起,我撒谎了。 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

您好!你能提供更多关于你的静态方法的细节吗?它叫什么名字?你把“Thread.sleep”放在哪里? 'verifyStatic'之前?或之后? –

回答

0

添加以下代码来测试的开头:

PowerMockito.mockStatic(AClass.class); 
+0

感谢您的答复!我已经打电话给mockStatic了。对不起,没有。另外,我已经准备好在没有詹金斯的情况下重现这一点。 – donahchoo

0

不能告诉你的问题实际上是什么;将surefire从2.17升级到2.18时遇到了类似的问题。

虽然我可能会提供一种解决方法:正如surefire documentation中所建议的那样,我在使用PowerMockito的测试中添加了@NotThreadSafe - 它为我做了这些。

0

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