JUnit测试用例对象实例化

9
在JUnit测试用例中,每个测试方法是否使用一个新的(或不同的)TestCase对象实例?还是一个实例被重复使用于所有测试中?
public class MyTest extends TestCase {
  public void testSomething() { ... }
  public void testSomethingElse() { ... }
}

运行此测试时,MyTest类的实例数量是多少?

如果可能的话,请提供一个文件或源代码链接以验证该行为。

5个回答

8

是的,会创建一个单独的实例。

运行该测试时,会创建2个 MyTest 实例。

如果您希望有不同的行为,则可以使用类似的工具 TestNG(http://testng.org/doc/)。


谢谢您的快速回复。您能否提供一个文档或源代码的链接,以便我可以验证这个行为? - Manki
您可以通过提供一个构造函数并添加 System.out.println 来轻松验证它。 - André

4

在JUnit文档中,我找不到一个明确的答案来回答你的问题。但是,正如anjanb所写,每个测试用例都是独立的,因此可以为每个要运行的测试创建一个新的TestCase实例。

如果您有昂贵的测试设置(“fixtures”),并且希望在测试类中的所有测试用例之间共享它们,您可以使用静态方法上的@BeforeClass注释来实现此结果:http://junit.sourceforge.net/javadoc_40/org/junit/BeforeClass.html。但请注意,仍然可能为每个测试创建一个新实例,但这不会影响您的@BeforeTest方法初始化的静态数据。


@BeforeClass在JUnit 3中不可用。这里描述了一个等效项:https://dev59.com/iHA75IYBdhLWcg3w794Y - Peter Wippermann

3
每次测试运行都会有一个实例。请尝试。
public class MyTest extends TestCase {
  public MyTest() { System.out.println("MyTest Constructor");
  public void setUp() { System.out.println("MyTest setUp");
  public void tearDown() { System.out.println("MyTest tearDown");
  public void testSomething() { System.out.println("MyTest testSomething");
  public void testSomethingElse() { System.out.println("MyTest testSomethingElse");
}

源代码(包括更新版本的代码-你和我所举的例子是Junit 3)可以在http://www.junit.org找到。


2
如果您之所以问这个问题是因为您担心在构造函数中初始化和重新初始化数据,那么请注意,初始化测试用例数据的规定方式是仅通过setUp()和tearDown()进行。

0

是的,绝对正确。我发现由于这种设计,存储在实例变量中的数据无法在测试之间进行访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接