期待 JUnit 的异常不起作用

Expecting Exceptions with JUnit doesn't work

我为我的方法编写了一个 JUnit 测试。
这是我的方法:

   public static int delimit(int value, int min, int max) throws IllegalArgumentException {
      if (min > max)
         throw new IllegalArgumentException("Min value was greater than max value.");

      return Math.min(max, Math.max(min, value));
   }

这是测试:

   public class DMathTest extends TestCase {
   @Rule
   public ExpectedException exception = ExpectedException.none();

   @Test
   public void testDelimit() {
      ...

      exception.expect(IllegalArgumentException.class);
      DMath.delimit(1, 3, 2);
   }

}

确实抛出了IllegalArgumentException,但JUnit在测试中将其标记为错误。它告诉我测试失败,因为(预期的)异常。没有 AssertionError 或任何东西,它只是显示我的 IllegalArgumentException,就好像整个期望代码都不存在一样。 然后我删除了规则和所有期望代码,结果完全相同(当然,这是应该的)。所以规则和调用

exception.expect(IllegalArgumentException.class);

什么都没做。
我正在使用 Eclipse,我使用 Maven 包含 JUnit。依赖元素如下所示:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

我做错了什么?为什么期望异常不起作用?

public class DMathTest extends TestCase {
                       ^^^^^^^^^^^^^^^^

这可能是错误。 TestCase是JUnit3.xAPI。 JUnit 4.x 测试不再扩展 class,并且可能通过扩展它来改变语义。请删除 extends 子句并重试,否则您的代码看起来是正确的。

此外,在 JUnit 4.x 中,您不再需要使用 "testXyz" 命名约定。方法名可以是任何东西,只要方法是 public 并且用 @Test 注释即可。我通常使用 "should" 方法名称,例如"delimitShouldFailIfMinGtMax"。这使得测试报告更具可读性。