当前位置: 首页 > 面试题库 >

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

刁浩言
2023-03-14
问题内容

当我尝试在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


问题答案:

首先,您正在将 ALPHA 快照工件(即org.junit:junit5-api:5.0.0-SNAPSHOT)与 M2
工件(即org.junit.platform:junit-platform-surefire- provider:1.0.0-M2)混合在一起,这将永远无法工作。

用户指南中的Maven部分建议您pom.xml从junit5-maven-
consumer
项目中签出。如果遵循该示例,最终将得到类似以下内容的结果。

<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。但是,这将不包含JupiterTestEngineIDE的类路径中。

如果仅通过Maven或最新版本的IntelliJ 2016(具有对JUnit
5的内置支持)运行测试,那么您可能不在乎JupiterTestEngineIDE中的类路径是否在此。但是…如果您使用的是Eclipse,NetBeans或IntelliJ的非beta版本,那么您肯定也希望将其JupiterTestEngine放在IDE的类路径中。

问候,

Sam( 核心JUnit 5提交者



 类似资料:
  • 问题内容: 在运行于Java 8的应用程序中,我正在使用将jar添加到引导类路径的方法。在Java 9中,该选项已删除。在Java 9中执行相同操作的替代方法是什么? 问题答案: 您可以使用。请参考发行说明,其中指出: 在此版本中,引导类路径已被大部分删除。Java 和选项已被删除。 仅当编译到JDK 8或更早版本时,才可以使用该选项。系统属性已被删除。 出于测试目的而依赖于覆盖平台类的部署将需要

  • 问题内容: 我正在运行Ubuntu,并希望通过包含多个jar文件从终端执行Java文件。 我的所有罐子都放在tha jar文件夹中。 我试过了 我得到以下错误。 谁能指导如何在classpath中使用多个jar? 问题答案: 从类路径中删除空格并添加当前路径 从Java 6开始,您可以使用类路径通配符

  • 我试图开发一个连接到Oracle数据库并执行函数的Java应用程序。如果我在Eclipse中运行应用程序,它可以工作,但是当我尝试在Windows命令提示符中运行. jar时,我会得到“遇到的错误:java.sql.SQLExc0019:找不到合适的驱动程序”。 我正在通过所有人的道路。在命令行中执行时,Eclipse中Maven依赖项中显示的jar文件。 步骤 > 从目标目录执行. jar,使用

  • 我有一个批处理文件,它使用依赖于tools.jar(来自JDK)的maven运行java类。 例如: mvn-f.\pom.xml-e exec:java-dfile.encoding=“utf-8”-dexec.mainclass=MyClass-dexec.args=“%1%2%3%4%5%6%7%8%9”-dexec.classpathscope=runtime 我的程序使用JDK中的too

  • 我正在使用maven构建工具。我的意图是将单独的绝对文件夹[例如:C:\test1.jar,C:\test2.jar]中可用的jar文件添加到类路径中。 我可以看到JAR被添加到war中可用的Manifest.mf文件的类路径中,但当war部署时,它由于“java.lang.ClassNotFoundException”[与test1.jar或test2.jar相关]而失败。 这是否意味着在man