Spring启动项目,有一个Web集成测试,当在eclipse中执行它时(运行为> 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测试不需要明确指定抽象?
答案 0 :(得分:1)
mvn surefire插件根据应用于src/main/test
下找到的所有类的一些简单规则自动检测测试套件。特别是,它查找与特定命名约定匹配的所有具体类。
https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html
在你的情况下,插件认为BaseWebIntegrationTest是一个测试套件,因为它符合命名约定,但它没有找到任何测试方法。当您创建类abstract
时,插件会跳过它,因为它不再可实例化。您也可以重命名该类,以便它不会在单词Test
中结束。
当您在Eclipse中运行测试时,我猜测您运行了特定的集成测试(ReservationControllerIntegrationTest
),因此Eclipse并没有尝试将BaseWebIntegrationTest视为测试套件。