首页 > 解决方案 > 包含字段的特定异常的断言

问题描述

目前我有一个测试,它试图检查一个特定的异常,如下所示:

assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .withCauseExactlyInstanceOf(ConstraintViolationException.class);

该异常ConstraintViolationException有一个constraintName可通过 getter 获得的字段,getConstraintName()但我还没有找到通过 assertj 进行检查的方法。

我可以想象以下内容:

assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .withCauseExactlyInstanceOf(ConstraintViolationException.class)
    .with("getConstraintName").isEqualTo("XXXX");

还是有其他方法可以做到这一点?

标签: javaassertj

解决方案


withCauseExactlyInstanceOf不会改变被测对象,但havingCause()可以对原因进行进一步的断言。

结合asInstanceOf()and returns(),类型安全检查将是:

assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .havingCause()
    .asInstanceOf(type(ConstraintViolationException.class))
    .returns("XXXX", from(ConstraintViolationException::getConstraintName));

或者没有类型安全,使用isInstanceOfand hasFieldOrPropertyWithValue

assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(
        () -> xrepo.save(abc))
    .havingCause()
    .isInstanceOf(ConstraintViolationException.class)
    .hasFieldOrPropertyWithValue("getConstraintName", "XXX")

推荐阅读