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 视为测试套房。
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 视为测试套房。