Java開發(fā)中一些編譯測試問題 之一

在項(xiàng)目中遇到一個奇怪的現(xiàn)象,一個單元測試(Junit)在IDE中可以執(zhí)行正確,但是使用Maven Test得不到正確結(jié)果。

1. 問題

經(jīng)過一陣子的調(diào)試跟蹤發(fā)現(xiàn)了問題所在。
假設(shè)測試在B模塊中,但是依賴了A模塊的方法a。B模塊的單元測試b使用了a, a的初始化要使用A.jar包內(nèi)的資源文件。
在IDE中,a是可以正確的找到A.jar的資源的。但是在Maven Test是找不到,所以初始化失敗。

2. 分析

初步分析應(yīng)該是IDE和MAVEN入口不一樣。
IDE啟動的是直接java 命令,命令中已經(jīng)給那些依賴的jar 添加到了classpath 中了,
Maven surefire, 如果那個參數(shù)沒打開的話,就只會設(shè)置jvm的classpath 做為參數(shù)。

其實(shí)這個surefire 2.4 引入的。如果maven 退回到2.3或者更早,應(yīng)該也沒問題了。

3. 解決辦法

加入?yún)?shù)useSystemClassLoader

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <forkCount>1</forkCount>
                    <reuseForks>false</reuseForks>
                   <useSystemClassLoader>false</useSystemClassLoader>
                </configuration>
            </plugin>

4. 進(jìn)一步分析

對比一下這個參數(shù)設(shè)置與否的Maven Test Trace.

1. 不設(shè)置

Forking command line: cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_131\jre\bin\java" -jar D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefirebooter7283450230329668804.jar D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire4601787208340921585tmp D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire_05380039621346427331tmp"

2. useSystemClassLoader = false

Forking command line: cmd.exe /X /C ""C:\Program Files\Java\jdk1.8.0_131\jre\bin\java" org.apache.maven.surefire.booter.ForkedBooter D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire345966431011675942tmp D:\Work\Touchpiont\Workspace\bda-dataimport\bda-collection-engine\target\surefire\surefire_05131872906470095968tmp"

4. 參考

Surefire ClassLoader

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容