配置 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>
...