【问题标题】:JUnit 5 Surefire Maven: how to run tests for a dynamic web module project?JUnit 5 Surefire Maven:如何为动态 Web 模块项目运行测试?
【发布时间】:2017-12-17 08:21:08
【问题描述】:

“mvn test”编译了我的测试用例,但没有运行它:

[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ test-server ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to my-server\backend\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.20.1:test (default-test) @ my-server ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]

pom.xml 属性:

<packaging>war</packaging>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    <java.version>1.8</java.version>
    <junit.version>4.12</junit.version>
    <junit.jupiter.version>5.0.0</junit.jupiter.version>
    <junit.vintage.version>${junit.version}.0</junit.vintage.version>
    <junit.jupiter.version>5.0.0</junit.jupiter.version>
    <junit.platform.version>1.0.0</junit.platform.version>      
</properties>

构建设置:

<build>
    <finalName>my-server</finalName>
    <testSourceDirectory>src/test</testSourceDirectory>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

依赖关系:

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-runner</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.vintage</groupId>
        <artifactId>junit-vintage-engine</artifactId>
        <version>${junit.vintage.version}</version>
        <scope>test</scope>
    </dependency>

测试类在testSourceDirectory目录下,名称以“Test”开头,并带有@Test注解。

我怀疑没有执行测试,因为包装是“war”而不是“jar”。但我无法改变它——整个项目只有一个“打包”设置,它必须是“战争”,因为它确实是一个网络应用程序。

那么如何运行我的测试,同时保持“战争”包装?

更新 添加建议的万无一失的提供者后,测试失败。 surefire-reports/*.dump 文件显示了这个回溯:

# Created on 2017-12-17T10:58:50.171
java.lang.NoSuchMethodError: org.apache.maven.surefire.report.RunListener.testSetStarting(Lorg/apache/maven/surefire/report/ReportEntry;)V
    at org.junit.platform.surefire.provider.JUnitPlatformProvider.invokeSingleClass(JUnitPlatformProvider.java:137)
    at org.junit.platform.surefire.provider.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:126)
    at org.junit.platform.surefire.provider.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:105)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:373)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:334)
    at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:119)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:407)

【问题讨论】:

  • 首先保持约定,不要通过&lt;testSourceDirectory&gt;src/test&lt;/testSourceDirectory&gt;..更改目录结构。测试必须驻留在src/test/java...而不是...进一步添加对maven的依赖项- surefire-plugin (junit-platform-surefire-provider) 见这里:github.com/junit-team/junit5-samples/blob/r5.0.2/…
  • 添加建议的插件后,我得到一个“NoSuchMethodError”。

标签: java maven junit


【解决方案1】:
JUnit 5 will works fine with following combination of dependencies and plugin version, both in JDK 8/11. 

Dependency
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.2.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.2.0</version>
    <scope>test</scope>
</dependency>

Build
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.0</version>
</plugin>

【讨论】:

    【解决方案2】:

    好像org.apache.maven.surefire.report.RunListener.testSetStartingwas changed在2.21.0中的签名。 junit-platform-surefire-provider 依赖于surefire-api.2.19.1,因此它使用ReportEntry 的实例调用testSetStarting,该方法现在接受TestSetReportEntry

    依赖项是 upgraded to 2.21.0,所以我们只需要等待 junit 5 的下一个版本。

    我已经建立了 junit 当前的 master 分支,并且可以确认 junit-platform-1.2.0-SNAPSHOT 和 juniper-5.2.0-SNAPSHOT 可以正常工作。

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多