4

我在使用 JUnit 4 时有一个问题。有一件事让我很困惑。为什么下面没有main函数,但是可以执行并返回测试结果?它甚至不扩展一个类。好困惑....代码如下:

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 {

}
4

3 回答 3

5

main 方法(不是函数)在 runner 类中实现。运行程序类由 IDE 或构建工具调用,然后运行程序加载测试类并执行所有标记的方法(即通过 @Test 注释)。

测试的生命周期比 main 函数要复杂一些。您可以在执行每个 @Test 之前进行准备(@BeforeClass 和 @Before 注释方法),然后进行清理(@After 和 @AfterClass 注释方法)。

这个框架为您提供了更多的灵活性,而不仅仅是一个主要的方法。也可以单独运行带注释的测试:您可能有一个庞大的测试套件,但您可能希望在纠正错误的同时重复运行失败的测试;这不能通过 main 方法来完成(除非您对每个测试都有一个 main 方法)。

如您所见,使用 JUnit 之类的框架与带有 main 的普通 Java 类相比有几个优点。

于 2012-12-23T15:12:27.710 回答
0

测试运行者的角色是这样做的。JUnit < 4 中也没有main()方法。只是 JUnit 4 运行器依赖于注解,而 JUnit 3 运行器依赖于方法名称。

于 2012-12-23T15:07:30.307 回答
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

https://github.com/joewalnes/idea-community/blob/master/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java

main-> prepareStreamsAndStart(***)-> getAgentClass(***)->Class.forName("com.intellij.junit4.JUnit4IdeaTestRunner")

https://github.com/joewalnes/idea-community/blob/1fa2c45953ed08667da52b1b83d44c56eb83b043/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java

startRunnerWithArgs(***)->JUnit4TestRunnerUtil.buildRequest(args)

https://github.com/joewalnes/idea-community/blob/1fa2c45953ed08667da52b1b83d44c56eb83b043/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java

buildRequest(***)-> else { int index = suiteClassName.indexOf(',');***-> 获取你的类名,方法名,并初始化执行。

main 方法(不是函数)在 runner 类中实现。 ” @Luigi R. Viggiano 是对的!

于 2019-09-12T06:18:48.893 回答