如何使用 JUnit 测试注释断言我的异常消息?

2022-08-31 04:46:48

我已经写了一些带有注释的JUnit测试。如果我的测试方法引发一个已检验的异常,并且如果我想断言消息和异常,有没有办法使用 JUnit 注释来执行此操作?AFAIK,JUnit 4.7不提供此功能,但是否有任何未来版本提供此功能?我知道在.NET中您可以断言消息和异常类。在Java世界中寻找类似的功能。@Test@Test

这就是我想要的:

@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}

答案 1

您可以将@Rule注释与 ExpectedException 一起使用,如下所示:

@Rule
public ExpectedException expectedEx = ExpectedException.none();

@Test
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() throws Exception {
    expectedEx.expect(RuntimeException.class);
    expectedEx.expectMessage("Employee ID is null");

    // do something that should throw the exception...
    System.out.println("=======Starting Exception process=======");
    throw new NullPointerException("Employee ID is null");
}

请注意,文档中的示例(当前)是错误的 - 没有公共构造函数,因此您必须使用 .ExpectedExceptionExpectedException.none()


答案 2

在 JUnit 4.13 中,您可以执行以下操作:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;

...

@Test
void exceptionTesting() {
  IllegalArgumentException exception = assertThrows(
    IllegalArgumentException.class, 
    () -> { throw new IllegalArgumentException("a message"); }
  );

  assertEquals("a message", exception.getMessage());
}

这也适用于 JUnit 5,但具有不同的导入:

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

...