配置 NetBeans 以使用 JMockit 作为 javaagent 执行单个单元测试
Configure NetBeans to execute single unit tests with JMockit as javaagent
使用JMockit和Maven进行单元测试时,需要通过设置-javaagent
参数将jmockit.jar
的位置传递给VM。 maven-dependency-plugin
可以自动执行此操作,我已经设置了一个配置来执行预期的操作:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${dependency.plugin.version}</version>
<executions>
<execution>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<argLine>-javaagent:${org.jmockit:jmockit:jar}</argLine>
</configuration>
</plugin>
这在从命令行调用测试套件和单个测试时有效,例如通过
mvn test -Dtest=MyClass#someTest
从 NetBeans 中也可以 运行 整个测试套件(例如,当 "Clean and Build" 被执行时)。但是在测试单个文件时,并没有注入路径。虚拟机崩溃时,日志中有如下命令:
Command was /bin/sh -c cd /home/kap && /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/jre/bin/java '-javaagent:${org.jmockit:jmockit:jar}' -jar ...
即占位符未填充正确的位置。相反,命令行上的调用会产生
[DEBUG] Forking command line: /bin/sh -c cd /home/kap/ && /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/jre/bin/java -javaagent:/home/kap/.m2/repository/org/jmockit/jmockit/1.49/jmockit-1.49.jar
特别奇怪的是它适用于整个测试套件,但不适用于单个测试。
为什么单测不通过?
当执行 clean and build
时,NetBeans 默认执行 mvn clean install
。因此 Maven 在其正常的构建生命周期中执行目标 org.apache.maven.plugins:maven-dependency-plugin:properties
并且插件创建变量 ${org.jmockit:jmockit:jar}
.
当执行单个测试文件时(即 Project -> TestFile -> RightClick -> Test File
(或 Ctl+F6))NetBeans 仅执行单个 目标mvn -Dtest=MyClass#someTest surefire:test
。所以 maven-dependency-plugin:properties 根本不执行并且 maven 找不到变量 ${org.jmockit:jmockit:jar}
因为它没有被创建。
如何解决?
选项 1.
转到 Project -> Properties -> Actions
并为操作测试文件设置选项以执行目标,如下所示:
test-compile org.apache.maven.plugins:maven-dependency-plugin:properties surefire:test
NetBeans 创建 nbactions.xml 文件,因此该解决方案仅在从 NetBeans 执行单个测试时有效。
选项 2。
从你身上移除 maven-dependency-plugin pom.xm。而是使用 ${settings.localRepository}
property:
将位置指定为 jmockit.jar
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<jmockit.version>1.43</jmockit.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>-javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar</argLine>
</configuration>
</plugin>
</plugins>
</build>
...
选项 3.
我假设将属性目标绑定到 maven 的测试编译阶段,但只有在禁用 NetBeans 的保存时编译功能时它才会起作用。
...
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>test-compile</phase>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
...
使用JMockit和Maven进行单元测试时,需要通过设置-javaagent
参数将jmockit.jar
的位置传递给VM。 maven-dependency-plugin
可以自动执行此操作,我已经设置了一个配置来执行预期的操作:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${dependency.plugin.version}</version>
<executions>
<execution>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<argLine>-javaagent:${org.jmockit:jmockit:jar}</argLine>
</configuration>
</plugin>
这在从命令行调用测试套件和单个测试时有效,例如通过
mvn test -Dtest=MyClass#someTest
从 NetBeans 中也可以 运行 整个测试套件(例如,当 "Clean and Build" 被执行时)。但是在测试单个文件时,并没有注入路径。虚拟机崩溃时,日志中有如下命令:
Command was /bin/sh -c cd /home/kap && /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/jre/bin/java '-javaagent:${org.jmockit:jmockit:jar}' -jar ...
即占位符未填充正确的位置。相反,命令行上的调用会产生
[DEBUG] Forking command line: /bin/sh -c cd /home/kap/ && /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/jre/bin/java -javaagent:/home/kap/.m2/repository/org/jmockit/jmockit/1.49/jmockit-1.49.jar
特别奇怪的是它适用于整个测试套件,但不适用于单个测试。
为什么单测不通过?
当执行 clean and build
时,NetBeans 默认执行 mvn clean install
。因此 Maven 在其正常的构建生命周期中执行目标 org.apache.maven.plugins:maven-dependency-plugin:properties
并且插件创建变量 ${org.jmockit:jmockit:jar}
.
当执行单个测试文件时(即 Project -> TestFile -> RightClick -> Test File
(或 Ctl+F6))NetBeans 仅执行单个 目标mvn -Dtest=MyClass#someTest surefire:test
。所以 maven-dependency-plugin:properties 根本不执行并且 maven 找不到变量 ${org.jmockit:jmockit:jar}
因为它没有被创建。
如何解决?
选项 1.
转到 Project -> Properties -> Actions
并为操作测试文件设置选项以执行目标,如下所示:
test-compile org.apache.maven.plugins:maven-dependency-plugin:properties surefire:test
NetBeans 创建 nbactions.xml 文件,因此该解决方案仅在从 NetBeans 执行单个测试时有效。
选项 2。
从你身上移除 maven-dependency-plugin pom.xm。而是使用 ${settings.localRepository}
property:
...
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<jmockit.version>1.43</jmockit.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<argLine>-javaagent:"${settings.localRepository}"/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar</argLine>
</configuration>
</plugin>
</plugins>
</build>
...
选项 3.
我假设将属性目标绑定到 maven 的测试编译阶段,但只有在禁用 NetBeans 的保存时编译功能时它才会起作用。
...
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>test-compile</phase>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
...