关于java:期望使用JUnit的异常不起作用

Expecting Exceptions with JUnit doesn't work

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

1
2
3
4
5
6
   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));
   }

这是测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
   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,好像整个期望代码都没有。
然后我删除了规则和所有期望代码,结果完全相同(当然,这应该是这样的)。 所以规则和电话

1
exception.expect(IllegalArgumentException.class);

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

1
2
3
4
5
6
<dependency>
    <groupId>junit</groupId>
    junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

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


1
2
public class DMathTest extends TestCase {
                       ^^^^^^^^^^^^^^^^

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

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