AssertJ:使用方法assertThatThrownBy时如何返回实际异常

Art*_*ich 3 java assertj junit5

我正在从 JUnit 5 和 Hamcrest Assertions 迁移到 AssertJ,但我无法找出从可执行文件中提取实际异常的正确方法。这是一个 JUnit/Hamcrest 示例:

var result = assertThrows(MyException.class, () -> this.objectUnderTest.someMethod(param1, param2, param3));
assertThat(result.getError().getErrorCode(), equalTo(someValue));
assertThat(result.getError().getDescription(), equalTo("someString"));
Run Code Online (Sandbox Code Playgroud)

我想要的是某物。像(断言J)

var result = assertThatThrownBy(() -> this.objectUnderTest.someMethod(param1, param2, param3))
 .isInstanceOf(MyException.class);
assertThat(result.getError().getErrorCode(), equalTo(someValue));
assertThat(result.getError().getDescription(), equalTo("someString"));
Run Code Online (Sandbox Code Playgroud)

但从 AssertJ 版本开始,3.21.0assertThatThrownBy方法为我提供了一个AbstractThrowableAssert<?, ? extends Throwable>类的实例,但我找不到任何可以为我提供该MyException实例的方法。所以现在我最终使用了另一种方法并手动转换为MyException

Throwable throwable = Assertions.catchThrowable(() -> this.objectUnderTest.doFilterInternal(param1, param2, param3));
MyException exception = (MyException) throwable;
assertThat(exception.getError().getErrorCode(), equalTo(someValue));
assertThat(exception.getError().getDescription(), equalTo("someString"));
Run Code Online (Sandbox Code Playgroud)

Ste*_*dio 5

AssertJ 提供了两种检查自定义异常的样式:

保持示例的风格,您可以使用以下内容编写catchThrowable

Throwable throwable = catchThrowable(() -> this.objectUnderTest.someMethod(param1, param2, param3));

assertThat(throwable)
  .asInstanceOf(InstanceOfAssertFactories.throwable(MyException.class))
  .extracting(MyException::getError)
  .returns(1, from(Error::getErrorCode))
  .returns("something", from(Error::getDescription));
Run Code Online (Sandbox Code Playgroud)

或者,与catchThrowableOfType

MyException exception = catchThrowableOfType(() -> this.objectUnderTest.someMethod(param1, param2, param3), MyException.class);

assertThat(exception)
  .extracting(MyException::getError)
  .returns(1, from(Error::getErrorCode))
  .returns("something", from(Error::getDescription));
Run Code Online (Sandbox Code Playgroud)