任何人都可以告诉我如何使用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
有什么主意吗?
谢谢
答案 0 :(得分:2)
抛出单个异常,类型为FunctionalException
。 cause
的{{1}}是FunctionalException
。
假设ConstraintViolationException
是JUnit 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,因为它具有许多流畅的方法。