mvn package 失败,因为没有 运行nable 方法,但 运行 eclipse 中的 junit 测试正常

mvn package failed because no runnable methods but run junit test in eclipse is ok

Spring boot project,有一个web集成测试,在eclipse中执行(运行 as > junit test)就可以了。

public class ReservationControllerIntegrationTest extends BaseWebIntegrationTest{...}

但是当运行 mvn clean package时,遇到如下错误:

initializationError(com.foo.web.BaseWebIntegrationTest)  Time elapsed: 0.005 sec  <<< ERROR!
java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:140)

当我改变时

public class BaseWebIntegrationTest

public abstract class BaseWebIntegrationTest

然后运行又mvn clean package,这次构建成功! 那么为什么 运行 eclipse 中的 junit test 不需要显式指定 abstract 呢?

mvn surefire 插件 auto-detects 测试套件基于一些简单的规则,适用于它在 src/main/test 下找到的所有 classes。特别是,它查找所有符合特定命名约定的具体 classes。

https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

在你的情况下,插件认为 BaseWebIntegrationTest 是一个测试套件,因为它符合命名约定,但它没有在其中找到任何测试方法。当您创建 class abstract 时,插件会跳过它,因为它不再是可实例化的。您也可以重命名 class,这样它就不会以 Test.

这个词结尾

当您 运行 在 Eclipse 中进行测试时,我猜您 运行 特定的集成测试 (ReservationControllerIntegrationTest) 因此 Eclipse 不会尝试将 BaseWebIntegrationTest 视为测试套房。