Surefire并没有selectJunit 4testing
出于某种原因,我无法获得Maven 2 Surefire插件来执行JUnit 4testing课程。
public class SimpleTest { @org.junit.Test public void simple() { System.out.println("foo"); } }
不过如果我把这个类改成JUnit-3之类的,比如
public class SimpleTest extends junit.framework.TestCase { public void testBar() { System.out.println("bar"); } @org.junit.Test public void simple() { System.out.println("foo"); } }
然后它被执行。 以下是我所做的:
- 已validationMaven版本:Apache Maven 2.2.1(r801777; 2009-08-06 20:16:01 + 0100)
- 经过validation的Surefire版本:遵循这个build议
- 经过validation的Surefire版本:在我的
~/.m2/repository/org/apache/maven/surefire
检查了Surefire jar,它们都是版本2.4.2或2.4.3 - 做了一个
mvn dependency:tree | grep junit
mvn dependency:tree | grep junit
以确保我只依赖于junit版本4.7
我有这个问题的模块没有JUnit 3testing。
还有什么我失踪?
mvn -X
帮助我揭示了以下内容:
... [INFO] [surefire:test {execution: default-test}] [DEBUG] dummy:dummy:jar:1.0 (selected for null) [DEBUG] org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime) [DEBUG] org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime) [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar [DEBUG] dummy:dummy:jar:1.0 (selected for null) [DEBUG] org.testng:testng:jar:jdk15:5.8:test (selected for test) [DEBUG] junit:junit:jar:3.8.1:test (selected for test) [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar [DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar [DEBUG] dummy:dummy:jar:1.0 (selected for null) [DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository. [DEBUG] Adding managed dependencies for unknown:surefire-testng [DEBUG] org.apache.maven.surefire:surefire-api:jar:2.4.3 [DEBUG] org.apache.maven.surefire:surefire-booter:jar:2.4.3 [DEBUG] org.codehaus.plexus:plexus-utils:jar:1.5.1 [DEBUG] org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test) [DEBUG] org.apache.maven:maven-artifact:jar:2.0:test (selected for test) [DEBUG] org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test) [DEBUG] junit:junit:jar:3.8.1:test (selected for test) [DEBUG] org.testng:testng:jar:jdk15:5.7:test (selected for test) [DEBUG] org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test) ... [DEBUG] Test Classpath : ... [DEBUG] /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar
所以这个问题似乎来自需要JUnit v3.8.1的testng
jar。 即使Test Classpath
被设置为依赖于JUnit 4,也为时已晚。
testng
依赖关系位于我的POM中:
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>5.8</version> <scope>test</scope> <classifier>jdk15</classifier> </dependency>
在我评论完之后立即开始执行testing。
得到教训:
-
mvn dependency:tree
并不总是足够的,mvn -X
是朋友。 - surefire不是开发者天堂(我已经意识到这一点,同时看项目JIRA报告)。 这是尤其如此,因为如果你使用Maven没有其他的select。
感谢大家的帮助。 不幸的是,Pascal和Kaleb之间没有办法把答案分开,但是Kalebbuild议使用mvn -X
帮助我走上正确的轨道,所以正确的答案指向他。
Surefire插件根据类path找出应该使用哪个JUnit提供程序。 如果类path中有多个JUnit版本,则可以更正类path,使其仅在类path中具有一个JUnit版本(如上所述),也可以明确指定要使用的提供程序。 例如,使用最新的提供者(例如“surefire-junit47”)在你的(父)POM部队中指定以下内容:
[...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <dependencies> <!-- Force using the latest JUnit 47 provider --> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.8</version> </dependency> </dependencies> [...]
但是请注意,Surefire 2.7改变了确定运行unit testing类的方式。 当使用JUnit 4使用Surefire 2.7(或更高版本)时,新的行为是没有@Test注释的任何testing都会被自动跳过。 如果您只有JUnit 4unit testing,这可能会很好,但如果您有JUnit 3和4unit testing的组合,则使用“surefire-junit47”提供程序将无法正常工作。 在这种情况下,最好明确地select“surefire-junit4”提供者:
[...] <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <!-- Use the older JUnit 4 provider --> <artifactId>surefire-junit4</artifactId> <version>2.8</version> </dependency> </dependencies> [...]
我不知道“不能执行”是什么意思,但是它有助于明确设置maven-surefire-plugin
使用的包含吗?
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.4.3</version> <configuration> <includes> <include>**/*Test.java</include> </includes> </configuration> </plugin>
此外,使用-X
标志运行maven提供任何有用的信息?
另一个可能的原因可能是这个错误(closures“不会修复”): https : //issues.apache.org/jira/browse/SUREFIRE-587
简短摘要:如果testing扩展TestCase(但不使用注释)将不会被拿起,如果他们的名字不以“testing”结束。
为了Google员工的利益,当我遇到这个问题时,是因为我包含了一个拉到TestNG中的PowerMock依赖项,导致SureFire没有检测到[TestNG]testing。
我使用了POM编辑器的m2eclipse“Dependency Hierarchy”选项卡来查找依赖项,并右键单击以生成排除(请参阅下面的XML)。
为了完整性(对于那些不使用m2eclipse的人),这里是排除依赖关系的XML – 我只通过看到自动生成的这些标签来看到Maven的这个特性:
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-mockito-release-full</artifactId> <version>1.4.9</version> <classifier>full</classifier> <exclusions> <exclusion> <artifactId>powermock-module-testng</artifactId> <groupId>org.powermock</groupId> </exclusion> </exclusions> </dependency>
(在我的情况下,不包括“powermock-module-testng”就足够了,但是如果从其他地方进入,可以直接排除TestNG。)
对于那些想知道为什么Maven没有selectJUnittesting的人来说,那些可怜的灵魂是不可思议的。
我有JUnit和TestNG作为依赖。 但是我想使用TestNG来运行我的functiontesting,并使用JUnit运行我的unit testing。
但是,我发现surefire试图使用TestNG运行我的unit testing,并没有发现任何运行。 我的JUnittesting被跳过了。
后来,我遇到了这个Maven的问题,并configurationsurefire只运行这样的“JUnit”testing:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <properties> <property> <name>junit</name> <value>true</value> </property> </properties> </configuration> </plugin>
希望这有助于某人。
你所做的validation是很好的,特别是检查你使用的是安全火狐插件的2.3以上版本(默认情况下,你会得到版本2.4.3与Maven 2.1 超级POM所以这应该是确定的),并检查你不要junit-3.8.1.jar
拉动junit-3.8.1.jar
依赖。
现在,为了validation这不是一个“全球性问题”(我不这么认为),你可以从头创build一个项目,例如运行:
mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase
然后更新junit依赖项:
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency>
并将编译器级别configuration为1.5+
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin>
最后把你的SimpleTest.java
放到AppTest.java
旁边,运行mvn test
。
如果运行mvn test
对于那个项目来说工作正常(而且我期望它运行没有问题),你能否用你正在使用的POMconfiguration更新你的问题(从项目有问题)?
一个小小的改变帮助我Funnily!
我将类名从MyClassTest更改为TestMyClass,我的父母POM.xml包含下面行
<test.include.pattern> **/Test*.java <test.include.pattern/>
您是否已经为正确的编译器级别configuration了maven-compile-plugin,如下所示:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> <plugin>
否则,maven会在注释中遇到麻烦
1.)在pom.xml中包含以下surefire插件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> <configuration> </configuration> </plugin>
2.)默认情况下,surefire插件从包中selecttesting类: – src / test / java / ….
所以去构buildpath和包括类path中的testing文件夹如下所示:
3.)转到 – >运行 – > Maventesting
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081 s - in com.bnym.dcm.api.controller.AccountControllerTest [INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest [INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in com.bnym.dcm.api.controller.DCMApiControllerTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ---------------------------------------------------------------------- -- [INFO] BUILD SUCCESS
尝试运行集成testing时遇到类似的问题。 我有一个旧版本的试图运行TestNG而不是jUnit的surefire插件。 我把pom中的版本号更改为2.20,它工作。