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

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

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.(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

  ...  org.junit junit5-api 5.0.0-SNAPSHOT test      maven-surefire-plugin 2.19   org.junit.platform junit-platform-surefire-provider 1.0.0-M2      

测试类:

 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部分建议从junit5-maven-consumer项目中查看pom.xml 。 如果您遵循该示例,您将得到类似以下内容的结果。

  UTF-8 1.8 5.0.0-M2 1.0.0-M2     maven-compiler-plugin 3.1  ${java.version} ${java.version}    maven-surefire-plugin 2.19   org.junit.platform junit-platform-surefire-provider ${junit.platform.version}        org.junit.jupiter junit-jupiter-api ${junit.jupiter.version} test   org.junit.jupiter junit-jupiter-engine ${junit.jupiter.version} test   

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

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

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

问候,

Sam( 核心JUnit 5提交者

Maven Surefire插件不仅需要JUnit 5提供程序,还需要TestEngine实现来运行测试。 引用JUnit 5文档 :

为了让Maven Surefire运行任何测试,必须将TestEngine实现添加到运行时类路径中。

按照以下方式工作:

    maven-surefire-plugin 2.19   org.junit.platform junit-platform-surefire-provider 1.0.0-M4   org.junit.jupiter junit-jupiter-engine 5.0.0-M4        org.junit.jupiter junit-jupiter-api 5.0.0-M4 test   

请注意,此配置使引擎成为surefire插件的依赖项, 而不是测试代码的依赖项。