没有至少一个 TestEngine 就无法创建 Launcher;考虑将引擎实现 JAR 添加到 Junit 5 中的类路径

新手上路,请多包涵

当我尝试在 junit5 中运行测试用例时,我得到了以下执行:

 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19:test (default-test) on project CRUD-App: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.19:test failed: There was an error in the forked process
org.junit.platform.commons.util.PreconditionViolationException: Cannot create Launcher without at least one TestEngine; consider adding an engine implementation JAR to the classpath
   at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:161)
   at org.junit.platform.launcher.core.DefaultLauncher.<init>(DefaultLauncher.java:52)
   at org.junit.platform.launcher.core.LauncherFactory.create(LauncherFactory.java:42)
   at org.junit.platform.surefire.provider.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:59)
   at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:286)
   at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:240)
   at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)

pom.xml

 <dependencies>
    ...
    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>junit5-api</artifactId>
        <version>5.0.0-SNAPSHOT</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>1.0.0-M2</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

测试类:

 public class PersonServiceTest {

    final Database database = Database.from("jdbc:h2:mem:" + App.DB_NAME);

    final PersonService personService = new PersonService(database);

    public PersonServiceTest() {
    }

    @Test
    @DisplayName("@Person#insert()")
    public void testInsert() {
        personService.insert(new PersonBuilder()
                .setId(1).setName("Bhuwan")
                .setAddress("KTM")
                .setContactNo("984849").createPerson()
        );
    }

}

Maven 目标: mvn test

原文由 Bhuwan Prasad Upadhyay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

ALPHA 快照工件(即 org.junit:junit5-api:5.0.0-SNAPSHOT )与 M2 工件(即 org.junit.platform:junit-platform-surefire-provider:1.0.0-M2 )混合,将不起作用。

用户指南中的 Maven 部分建议检查 junit5-maven-consumer 项目中的 pom.xml 。如果你按照那个例子,你最终会得到类似下面的东西。

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
    <junit.jupiter.version>5.0.0-M2</junit.jupiter.version>
    <junit.platform.version>1.0.0-M2</junit.platform.version>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-surefire-provider</artifactId>
                    <version>${junit.platform.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

编写 测试,您只需要 junit-jupiter-api ;但是,为了 运行 您的测试,您必须在类路径上有一个 TestEngine 。因此,对于 JUnit Jupiter,您在类路径上也需要 junit-jupiter-engine

正如 Nicolai Parlog 指出的那样,您可以添加 junit-jupiter-engine 作为 --- 的依赖 maven-surefire-plugin ;但是,这不会在您的 IDE 的类路径中包含 JupiterTestEngine

如果您仅通过 Maven 或最近的 IntelliJ 2016 测试版(内置对 JUnit 5 的支持)运行测试,那么您可能不关心 JupiterTestEngine 是否在您的 IDE 的类路径上.但是…如果您使用的是 Eclipse、NetBeans 或 IntelliJ 的非测试版,那么您肯定也希望 JupiterTestEngine 在 IDE 的类路径中。

问候,

Sam( _核心 JUnit 5 提交者_)

原文由 Sam Brannen 发布,翻译遵循 CC BY-SA 4.0 许可协议

由于使用 Gradle 和 JUnit 4 出现相同的错误而在此处结束。这种情况下的解决方案可以在 文档 中找到:

只要您配置对 JUnit 4 的 testImplementation 依赖项和对 JUnit Vintage TestEngine 实现的 testRuntimeOnly 依赖项,JUnit 平台就可以运行基于 JUnit 4 的测试,如下所示。

还需要一个测试引擎:

 dependencies {
    testImplementation("junit:junit:4.13.2")
    testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
}

原文由 lainatnavi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题