2016-12-28 45 views
15

我目前正在測試使用jdk-9 + 149將Java 8應用程序遷移到Java 9/Jigsaw。我應該在將Java 8項目遷移到拼圖時將單元測試放在哪裏?

該項目已在標準的Maven目錄結構進行佈局,即具有src/main/javasrc/test/java

只要我添加module-info.javasrc/main/java,Maven的編譯器插件無法拋出一個NullPointerException。這是因爲它預計也會找到test目錄的模塊信息。所以,據我所見,選項有:

  • 將測試類保存在一個單獨的模塊中,這意味着它們只能訪問主模塊的導出包。
  • 將測試類與源代碼一起移動到主模塊中,這意味着主模塊需要測試依賴關係。

很顯然,這兩個選項都不可取,所以我假設在Maven項目中測試Jigsaw模塊是一種推薦的方法。非常,我找不到任何建議和例子。

編輯:並稱,張貼問題時(對不起)我不認爲相關的一些信息

+0

你在maven-compiler插件中指定了哪些源和目標作爲配置?也請分享NPE的堆棧跟蹤,以清除所面臨的錯誤。 – nullpointer

+0

對不起,添加了一些更多的信息。但基本上,NPE只是導致我面臨實際問題的症狀,我將如何處理一般的測試。 – peterp

回答

9

對Java 9的Maven支持一般而言,特別是測試仍在de發展 - 許多事情都起作用,但其他事情卻不行。沒有看到NPE的堆棧跟蹤,這當然是猜測,但我認爲你ran into this error

更一般地說,單元測試如何與拼圖一起工作的問題仍在討論中 - 即使是on the Jigsaw mailing list

下面是我對此事的看法:

  1. 正如您注意,將測試到一個單獨的模塊將意味着只有公共類型在導出的包將可測試的,這肯定是不夠的。可能有解決方法,但是這些要求或者編輯模塊聲明(源代碼; module-info.java)或描述符(字節代碼,module-info.class),或者添加大量的--add-exports命令行標誌到javacjava命令編譯和運行測試。這些都不是特別有趣,特別是如果你想用手工做。

  2. 將測試移動到源代碼樹中也是一個壞主意,原因很明顯,其中最重要的原因是創建不帶測試的JAR需要大量的小提琴。

  3. 另一種選擇是使用--patch-module選項,該選項允許將class文件或JAR的內容添加到現有模塊。這樣testCompile步驟可以創建一個包含源文件的JAR文件。不幸的是,除非像上面描述的那樣操縱模塊聲明/描述,否則如果沒有爲測試依賴關係添加java --add-reads的讀取邊緣,則無法執行生成的JAR。還是比上面好。

  4. 作爲一種最後的手段,可以將生產JAR視爲常規JAR而不是模塊。最簡單的方法可能是將它與測試JAR一起轉儲到類路徑中。這種方式一切正常,如Java < 9.不幸的是,這將破壞使用功能的代碼,假設它位於命名模塊內(例如與反射API的某些類型的交互)。

就我個人而言,我認爲3.是上述選項中最好的。它不需要改變項目佈局,只需要對javacjava命令進行較小的添加。

+0

感謝您的詳細解答,Nicolai。很高興看到正在討論的話題。我將使用選項3和1進行一些測試,但我不知道可以在命令行上添加導出。 – peterp

+2

很高興我能幫到你。確保報告,在這裏,有一篇文章,或郵件給拼圖開發。此時基於實際實驗的所有反饋都是有價值的。 – Nicolai

+0

我一定會:) btw:[羅伯特的評論](http://stackoverflow.com/questions/41366582/where-should-i-put-unit-tests-when-migrating-a-java-8-project-to -jigsaw#comment69959520_41370766)也表示選項3可能是要走的路線 – peterp

6

您必須至少使用maven-compiler-plugin 3.6.0來支持拼圖。但是,自構建+148以來,類文件的二進制結構發生了變化,因此插件無法像以前那樣提取模塊名(模塊名需要能夠編譯測試)。我正在爲此做一個修復,但我可能依賴於新版本的ASM。

更新:maven-compiler-plugin-3.6.1已發佈,因此對拼圖的支持已恢復。

+0

謝謝,羅伯特。我沒有把它看作是一個maven問題(當然NPE沒有幫助) - 因爲測試代碼實際上沒有模塊化。所以即使代碼編譯並進入'unnamed'模塊,從src模塊測試的東西也不會按需要工作。但是閱讀Nicolai的[anwer](http:// stackoverflow。com/a/41367802/1006823)我知道這仍在討論中。 – peterp

+2

供參考:http://maven.apache.org/plugins/maven-compiler-plugin/xref/org/apache/maven/plugin/compiler/TestCompilerMojo.html#L259告訴你,maven-compiler-plugin正在使用解決方案3 @Nicolai已被驗證爲拼圖團隊的一些開發人員的正確方法 –

+0

我想我有一個誤解 - 在我發現時間有更深的視線進入你的鏈接之後,我注意到這是實際的代碼v3.6.0(我認爲這是未來的實現尚未發佈)。所以AFAICS(不知道Maven內部)看起來像我應該能夠對我的模塊化源(帶有模塊描述符)運行測試(無模塊描述符),如果它不是那個NPE的話。如果是這樣的話,應該可以在本地構建自己的編譯器插件以使其可用於測試目的。 getModuleName的預期返回值是什麼? – peterp

2

正如已經suggested here,使用Maven的編譯器插件的更新版本:3.7.0將幫助您解決這個問題: -

<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.7.0</version> 
     <configuration> 
      <source>9</source> 
      <target>9</target> 
      <compilerArgument>-Xlint:all</compilerArgument> 
     </configuration> 
    </plugin> 
</plugins> 

在哪裏可以放置在同一目錄下的單元測試它曾經在模塊化之前。這裏是基於JDK9和Maven3 +的sample project。該項目遵循如截圖所示的目錄結構: -

enter image description here

和POST這一切,你需要做的是使用下面的命令執行測試:

mvn test 

從的根目錄項目找到測試將照常執行。

相關問題