2012-12-23 33 views
3

我在使用JUnit 4时遇到了一个问题。有一件事让我非常困惑。 为什么下面没有主要功能,但是它可以被执行并且返回测试结果?它甚至没有扩展一个类。这样的代码如下:代码如下:java junit没有主要功能

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 { 

} 

回答

3

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

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

这个框架为您提供比只有一个主要方法更多的灵活性。也可以单独运行带注释的测试:您可能有一个巨大的测试套件,但您可能希望重复运行一个失败的测试,同时纠正错误;这不能用主要方法来完成(除非你有每个测试的主要方法)。你可以看到,使用像JUnit这样的框架相对于带有main的普通Java类有几个优点。

+0

好的,你是说runner类中的主要方法实际上是由eclipse IDE或builder工具实现的吗?我想这涉及到一些低级细节。我在哪里可以看到细节(跑步课程?)?此外,每次测试都会提供“测试”注释,无论何时我选择构建,IDE或构建工具都会调用runner类的主要方法,并根据注释执行测试(单个测试或整个测试套件) , 对?感谢您的详细解释! –

+0

否:IDE不执行任何操作。这里是你正在寻找的主要:https://github.com/KentBeck/junit/blob/master/src/main/java/org/junit/runner/JUnitCore.java 主要方法实际上是一个在Java中的约定用于启动命令行的程序;一旦IDE通过其main()启动,它可以直接使用junit功能作为正常的Java库访问其API。另一个例子:运行一个Java小程序,你不需要主要:http://docs.oracle.com/javase/tutorial/deployment/applet/subclass.html'appletviewer'实用程序提供了他自己的主要负载和运行applet init()。 –

+0

呃...我试图用命令行来运行上面的代码,它显示了异常,'线程中的异常'main“java.lang.NoSuchMethodError:main' 因此,Junit与IDE密切相关?如果我想实现一个功能(例如每隔一小时运行一次单元测试,遇到故障,开发人员将收到通知电子邮件),这是否意味着我无法使用上面的代码? –

0

这是测试跑步者这样做的角色。您在JUnit < 4中也没有main()方法。只是JUnit 4跑步者依赖注释,而JUnit 3跑步者依赖于方法名称。