2016-02-26 153 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,這在很大程度上降低了我們的生產力。