小编典典

JUnit 混淆:使用“扩展 TestCase”或“@Test”?

all

我发现 JUnit 的正确使用(或至少是文档)非常令人困惑。这个问题既可以作为未来的参考,也可以作为一个真实的问题。

如果我理解正确的话,创建和运行 JUnit 测试有两种主要方法:

方法 A(JUnit 3 风格): 创建一个扩展 TestCase 的类,并以单词test. 当将该类作为 JUnit 测试运行时(在
Eclipse 中),所有以单词开头的方法都会test自动运行。

import junit.framework.TestCase;

public class DummyTestA extends TestCase {

    public void testSum() {
        int a = 5;
        int b = 10;
        int result = a + b;
        assertEquals(15, result);
    }
}

方法 B(JUnit 4 风格): 创建一个“普通”类并@Test为方法添加注释。请注意,您不必以单词开头的方法test

import org.junit.*;
import static org.junit.Assert.*;

public class DummyTestB {

    @Test
    public void Sum() {
        int a = 5;
        int b = 10;
        int result = a + b;
        assertEquals(15, result);
    }
}

将两者混合似乎不是一个好主意,请参见例如这个 stackoverflow
问题

现在,我的问题:

  1. 首选方法是什么 ,或者您什么时候使用一种方法而不是另一种方法?
  2. 方法 B 允许通过扩展 @Test 注释来测试异常,例如 in @Test(expected = ArithmeticException.class)但是在使用方法 A 时如何测试异常?
  3. 使用方法 A 时,您可以将多个测试类分组到一个测试套件中,如下所示:

TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);

但这不能与方法 B 一起使用(因为每个测试类都应该是 TestCase 的子类)。 对方法 B 进行分组测试的正确方法是什么?

编辑:我已将 JUnit 版本添加到这两种方法中


阅读 70

收藏
2022-08-20

共1个答案

小编典典

区别很简单:

  • 扩展TestCase是用 JUnit 3 编写单元测试的方式(当然 JUnit 4 仍然支持它)
  • 使用@Test注解是JUnit 4引入的方式

通常您应该选择注释路径,除非需要与 JUnit 3(和/或早于 Java 5 的 Java 版本)兼容。新方式有几个优点:

要测试 JUnit 3 中的预期异常,TestCase您必须明确文本。

public void testMyException() {
  try {
    objectUnderTest.myMethod(EVIL_ARGUMENT);
    fail("myMethod did not throw an Exception!");
  } catch (MyException e) {
    // ok!
    // check for properties of exception here, if desired
  }
}

JUnit 5引入了另一个 API
更改,但仍然使用注释。新的@Test注释是org.junit.jupiter.api.Test(“旧的”JUnit
4 是org.junit.Test),但它的工作方式与 JUnit 4 几乎相同。

2022-08-20