美文网首页
Java开发中一些编译测试问题 之一

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

作者: WeiminSun | 来源:发表于2017-12-27 09:24 被阅读0次

在项目中遇到一个奇怪的现象,一个单元测试(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

<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. 进一步分析

对比一下这个参数设置与否的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开发中一些编译测试问题 之一

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

  • AndroidStudio执行main方法报错

    问题: 有时在开发中想直接写一个java文件来测试一些东西,但是AndroidStudio执行的时候会报错。 代码...

  • Maven简介

    前言 在Java项目开发中,项目的编译、测试、打包等是比较繁琐的,属于重复劳动的工作,浪费人力和时间成本。以往开发...

  • Android Studio 开发 java 项目

    前言 开发过程中常常会写一些测试代码作为验证,之前直接使用 javac、java 命令去编译和执行代码,可是当我在...

  • 使用Jenkins做Java、Android项目开发持续集成

    目的 使用Jenkins实现Java 、Android项目开发持续集成:自动编译、测试、质量分析、打包、分发部署。...

  • 如何快速打好Java基础?

    Java是用于软件开发的最流行的编程语言,无论做自动化测试或者测试开发,Java依然是最重要的选项之一。 为什么要...

  • 如何学习Java基础

    Java是用于软件开发的最流行的编程语言,无论做自动化测试或者测试开发,Java依然是最重要的选项之一。 为什么要...

  • CentOS中JDK的安装方法

    解压到/usr/local中 编写测试类:vim Test.java 编译:javac Test.java运行:j...

  • PHP工具箱:PHPStan —— PHP 静态代码分析工具

    PHPStan:无需写测试就能找到代码中的 Bug 每当我看到开发人员从 Java 或 C# 等编译语言切换到 P...

  • Android app安全性能测试

    1.安装包测试 (1)能否反编译代码(源代码泄露问题): 开发:对代码进行混淆;测试:使用反编译工具进行查看源代码...

网友评论

      本文标题:Java开发中一些编译测试问题 之一

      本文链接:https://www.haomeiwen.com/subject/hnuygxtx.html