Java 使用junit 5测试预期的异常消息

Java 使用junit 5测试预期的异常消息,java,junit,junit4,junit5,Java,Junit,Junit4,Junit5,我有一个项目,在那里我有测试,我故意造成一个问题,然后验证代码的响应方式我想要它。为此,我想确保异常不仅是正确的类,而且还必须包含正确的消息 所以在其中一个例子中,我有类似的东西: public class MyTests { @Rule public final ExpectedException expectedEx = ExpectedException.none(); @Test public void testLoadingResourcesTheBadWay(){

我有一个项目,在那里我有测试,我故意造成一个问题,然后验证代码的响应方式我想要它。为此,我想确保异常不仅是正确的类,而且还必须包含正确的消息

所以在其中一个例子中,我有类似的东西:

public class MyTests {
  @Rule
  public final ExpectedException expectedEx = ExpectedException.none();

  @Test
  public void testLoadingResourcesTheBadWay(){
    expectedEx.expect(MyCustomException.class);
    expectedEx.expectMessage(allOf(startsWith("Unable to load "), endsWith(" resources.")));
    doStuffThatShouldFail();
  }
}
我目前正在考虑完全迁移到JUnit5,它不再支持,现在有了

我还没有弄清楚如何编写一个测试,不仅检查抛出的异常(类),而且还检查附加到该异常的消息


在Junit 5中编写这样一个测试的正确方法是什么?

感谢@michalk和我的一位同事,这很有效:

Exception expectedEx = assertThrows(MyCustomException.class, () ->
    doStuffThatShouldFail()
);
assertTrue(expectedEx.getMessage().startsWith("Unable to load "));
assertTrue(expectedEx.getMessage().endsWith(" resources."));
由于返回异常的实例,您可以对返回的实例调用
getMessage
,并对此消息进行断言:

Executable executable = () -> sut.method(); //prepare Executable with invocation of the method on your system under test

Exception exception = Assertions.assertThrows(MyCustomException.class, executable); // you can even assign it to MyCustomException type variable
assertEquals(exception.getMessage(), "exception message"); //make assertions here

assertThrows
返回一个异常,因此您可以对返回的实例调用
getMessage
,并对该消息进行断言。