我正在尝试在测试类中运行单个测试,但是类中的所有测试都会运行。
我正在运行它
mvn clean test -Dtest=TestClass#testMethod
我试过
mvn clean test -Dtest="TestClass#testMethod"
和
mvn clean test "-Dtest=TestClass#testMethod"
但似乎没有任何效果。 TestClass中的所有测试都会运行...
我在这里缺少什么?
测试路径:/development/src/test/java/com/company/project/TestClass.java
TestClass.java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestClass {
@Test
public void testMethod1() throws Exception {
System.out.println("running1");
}
@Test
public void testMethod2() throws Exception {
System.out.println("running2");
}
}
mvn -Dtest=TestClass#testMethod1 clean test
[INFO]
[INFO] --- maven-surefire-plugin:2.19.1:test (default-test) @ lazarus ---
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running TestClass
SLF4J: Class path contains multiple SLF4J bindings.
..
running1
running2
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.536 sec - in TestClass
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 50.452 s
[INFO] Finished at: 2017-03-01T13:42:51-05:00
[INFO] Final Memory: 41M/1781M
[INFO] ------------------------------------------------------------------------
编辑2:Power模拟依赖导致问题?
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-mockito-release-full</artifactId>
<version>1.6.4</version>
<classifier>full</classifier>
<scope>test</scope>
</dependency>
答案 0 :(得分:3)
这是一个棘手的错误。 powermock-mockito-release-full
依赖项带来了类路径TestNG,并且您希望使用JUnit运行测试,因为您的测试方法使用JUnit org.junit.Test
注释进行注释。这是故障的原因。
如果您未指定用于运行测试的提供程序,the Surefire Plugin will try to be clever并为您检测它。目的是,如果您依赖TestNG,它将自动选择其TestNG提供程序来运行您的测试。相反,如果您依赖JUnit,它将使用其JUnit提供程序。这甚至depends on the version of TestNG or JUnit。这对于简化配置非常有用,但是当两者都在类路径上时...未指定将会发生什么。事实证明,Surefire 2.19.1将首先选择TestNG(参见源代码auto-detecting the provider和TestNG being specified before any JUnit specific providers in the list of well known providers)。您可以检查这是在调试模式下查看日志的情况(使用-X
);开始测试时,你会看到
Running com.company.project.TestClass
Configuring TestNG with: TestNG60Configurator
证明正在使用TestNG提供程序。
这里会有几个解决方案。首先,在测试类路径上同时使用TestNG和JUnit可能不是你想要的东西,除非你明确地想要为你的测试使用这两个框架。因此,极简主义的解决方案是将TestNG完全排除为powermock-mockito-release-full
的传递依赖,因此它不会在测试类路径中结束,实际上,添加
<exclusions>
<exclusion>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</exclusion>
</exclusions>
解决了这个问题,只使用正确的-Dtest=TestClass#testMethod1
调用运行了一个测试。
也许更好的第二个解决方案是删除对powermock-mockito-release-full
的依赖,这会在测试类路径中带来很多你最不想要的东西。值得注意的是,它甚至带来了来源JAR!如果您仅依赖于powermock-module-junit4
,则问题也会得到解决,而不会使您的类路径混乱。您可以自己添加对Mockito或您需要的其他特定组件的依赖。
第三种解决方案是to force the use of the JUnit 47 provider。这将确保测试使用JUnit而不是TestNG运行,即使两者都在测试类路径中。
答案 1 :(得分:0)
你几乎是对的。只需将test
移到该行的末尾即可。
mvn -Dtest=TestClass#testMethod clean test