2013-04-24 101 views
2

我的代碼中有一個測試,它創建一個目錄,然後在其中創建一個文件。單元測試由於surefire插件forkmode而失敗

但是,此測試失敗,因爲寫入文件的測試部分無法找到所創建的目錄。修復它的唯一的事情就是設置萬無一失插件不會分支,像這樣:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
     <forkMode>never</forkMode> 
    </configuration> 
</plugin> 

我會解釋此修復程序意味着目錄在一個JVM過程中產生的,而在另一個JVM進程創建的文件/線程?

此測試失敗與最近剛開始失敗的單臺機器隔離。

,我已經嘗試了幾件事情是:

  1. 有衆多的JDK版本流傳在系統上,因此擺脫了所有的不同之處在於工作在許多其他系統的一個(1.6 .0_19)。
  2. 嘗試從Administrator cmd提示符運行該項目上的'mvn test'。
  3. 檢查父目錄的權限是否正確。
  4. 嘗試從零開始檢查整個項目並執行相同操作。
  5. 檢查發生此事的目錄是否從AntiVirus的按訪問掃描程序中排除。

以上都沒有任何效果。唯一有所作爲的是<forkMode>配置。我無法弄清楚爲什麼那個測試突然停止工作,因爲它周圍絕對沒有任何代碼變化或者它正在測試的功能。

正在使用的maven-surefire-plugin的版本是2.12.4。如果'never'配置丟失,更新到最新(2.14.1)不會修復測試。

<forkMode>deprecated但是僅在版本2.14以後。

我真的很感興趣的是潛在的問題可能是什麼。我希望最終的結論不像硬盤或硬件問題那麼簡單。

+2

是在測試'setUp()'方法中還是在另一個測試用例中創建的目錄?你爲每個測試創建不同的目錄還是在測試中共享?請記住,測試用例可能會重新排序或並行運行,並且 - 根據測試邏輯 - 可能導致目錄的併發修改。 – Pyranja 2013-04-24 08:22:03

+1

奇怪!我不太清楚這是兩個單獨的測試來創建目錄並寫入文件,或者如果兩個事件都發生在相同的測試方法中?測試執行順序可以由測試運行器隨機重新排序。 – 2013-04-24 08:24:36

+0

@Pyranja現貨!該目錄是在setUp()方法中創建的,並且有兩個測試然後嘗試在該目錄中創建文件。但我也曾在評論過所有其他測試之後嘗試過,但那次測試失敗了。 – 2013-04-24 10:47:47

回答

0

tl; dr:固定!

另一種全新的機器是爲用戶打造的。它工作了一個小時左右,然後在那之後,你看,完全一樣的問題。

普遍的共識是它必須是一個流氓Windows更新。所以我們嘗試了一些東西,比如將機器恢復到之前的狀態。手動卸載Windows更新等。沒有任何工作。

然後機器的主人有一個頓悟。顯然,他已經習慣了this註冊表黑客,這是這個美妙的神祕錯誤的原因。我們解開了這個,並且認爲mvn clean install工作正常!

我還是很好奇,但爲什麼它會影響一個java程序,所以這裏是圍繞它的後續問題:(完成與gihub回購來隔離有問題的代碼)Why does this autorun-cmd registry hack affect a java/maven process?

感謝所有有用的評論。