3

谁能告诉我如何使用 assertThrows 有几个例外?

例如,这是一个类:

 protected void checkViolation(Set<ConstraintViolation<EcritureComptable>> vViolations) throws FunctionalException {
    if (!vViolations.isEmpty()) {
        throw new FunctionalException("L'écriture comptable ne respecte pas les règles de gestion.",
                                      new ConstraintViolationException(
                                          "L'écriture comptable ne respecte pas les contraintes de validation",
                                          vViolations));
    }
}

和我的测试方法:

 @Test
void checkViolation(){
    comptabiliteManager = spy(ComptabiliteManagerImpl.class);
    when(vViolations.isEmpty()).thenReturn(false);

    assertThrows(  ConstraintViolationException.class, () ->comptabiliteManager.checkViolation(vViolations), "a string should be provided!");
}

我想匹配该方法并完全抛出ConstraintViolationExceptionFunctionalException

任何想法?

谢谢

4

2 回答 2

4

抛出一个异常,它的类型为FunctionalException. 这causeFunctionalException一个ConstraintViolationException.

假设assertThrowsJUnit 5 方法,它返回抛出的异常。因此,您可以简单地获取其原因并为此原因添加额外的检查。

于 2019-03-17T14:13:17.210 回答
2

我假设 ConstraintViolationException 将是 FunctionalException 的根本原因。在这种情况下,要检查抛出的异常是否有所需的原因,您可以执行类似的操作

Executable executable = () -> comptabiliteManager.checkViolation(vViolations);

Exception exception = assertThrows(FunctionalException.class, executable);

assertTrue(exception.getCause() instanceof ConstraintViolationException);

另一个可能更干净的解决方案是使用AssertJ及其 API。

Throwable throwable = catchThrowable(() -> comptabiliteManager.checkViolation(vViolations));

assertThat(throwable).isInstanceOf(FunctionalException.class)
            .hasCauseInstanceOf(ConstraintViolationException.class);

您必须从 AssertJ 的 Assertions 类中导入方法:

import static org.assertj.core.api.Assertions.catchThrowable;
import static org.assertj.core.api.Assertions.assertThat;

我鼓励你看看这个 API,因为它有很多流畅的方法。

于 2019-03-17T14:32:44.897 回答