assert引发多个异常

时间:2019-03-17 14:08:02

标签: java exception mockito juniper

任何人都可以告诉我如何使用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!");
}

我想匹配该方法并抛出 ConstraintViolationException FunctionalException

有什么主意吗?

谢谢

2 个答案:

答案 0 :(得分:2)

抛出单个异常,类型为FunctionalExceptioncause的{​​{1}}是FunctionalException

假设ConstraintViolationExceptionJUnit 5 method,它将返回抛出的异常。因此,您只需找出其原因并对此原因进行其他检查。

答案 1 :(得分:1)

我认为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,因为它具有许多流畅的方法。