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,它工作。