没有至少一个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插件的依赖项, 而不是测试代码的依赖项。