在項(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"