Java开发中一些编译测试问题 之一

在项目中遇到一个奇怪的现象,一个单元测试(Junit)在IDE中可以执行正确,但是使用Maven Test得不到正确结果。

1. 问题

经过一阵子的调试跟踪发现了问题所在。
假设测试在B模块中,但是依赖了A模块的方法a。B模块的单元测试b使用了a, a的初始化要使用A.jar包内的资源文件。
在IDE中,a是可以正确的找到A.jar的资源的。但是在Maven Test是找不到,所以初始化失败。

2. 分析

初步分析应该是IDE和MAVEN入口不一样。
IDE启动的是直接java 命令,命令中已经给那些依赖的jar 添加到了classpath 中了,
Maven surefire, 如果那个参数没打开的话,就只会设置jvm的classpath 做为参数。

其实这个surefire 2.4 引入的。如果maven 退回到2.3或者更早,应该也没问题了。

3. 解决办法

加入参数useSystemClassLoader


                org.apache.maven.plugins
                maven-surefire-plugin
                ${maven-surefire-plugin.version}
                
                    1
                    false
                   false
                
            

4. 进一步分析

对比一下这个参数设置与否的Maven Test Trace.

1. 不设置

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

你可能感兴趣的:(Java开发中一些编译测试问题 之一)