当我使用JUnit 4时,我有一个问题。有一件事让我很困惑。 为什么以下没有主要功能,但可以执行并返回测试结果?它甚至没有扩展一个类。如此困惑......代码如下:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({ ATest.class,BTest.class })
public class AllTests {
}
答案 0 :(得分:3)
主要方法(不是函数)在runner类中实现。运行者类由IDE或构建工具调用,然后运行器加载Test类并执行所有标记的方法(即通过@Test注释)。
测试的生命周期比主要功能稍微复杂一些。 您可以在执行每个@Test之前进行准备(@BeforeClass和@Before注释方法),然后进行清理(@After和@AfterClass注释方法)。
这个框架比只使用一个主要方法提供了更多的灵活性。也可以单独运行带注释的测试:您可能拥有一个巨大的测试套件,但您可能希望在纠正错误时反复运行一个失败的测试;这不能用main方法完成(除非你为每个测试都有一个main方法)。
如你所见,使用像JUnit这样的框架比使用main的普通Java类有几个优点。
答案 1 :(得分:0)
测试运行者的角色就是这样做。您在JUnit中没有main()
方法< 4要么。只是JUnit 4运行器依赖于注释,而JUnit 3运行器依赖于方法名称。
答案 2 :(得分:0)
IntelliJ IDEA 2018.3(社区版)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
详细信息,您可以查看IDEA的控制台日志。以下是我分析的启动过程。
测试类:com.example.BirdColorTest
测试方法:whichColor
java -classpath "***" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.example.BirdColorTest,whichColor
main
-> prepareStreamsAndStart(***)
-> getAgentClass(***)
-> Class.forName("com.intellij.junit4.JUnit4IdeaTestRunner")
startRunnerWithArgs(***)
-> JUnit4TestRunnerUtil.buildRequest(args)
buildRequest(***)
-> else { int index = suiteClassName.indexOf(',');***
->获取您的类名称,方法名称并初始化执行。
“ 主要方法(不是函数)是在运行器类中实现的。” @Luigi R. Viggiano是正确的!