自定义 assertThatThrownBy

Custom assertThatThrownBy

阅读这篇文章后 article 我肯定会写自己的断言,但我失败了。 :-(

我们有一个如下所示的界面:

public class ApplicationException extends RuntimeException {
    public String enhancedStatus() {
        return getClass().getSimpleName();
    }
}

我按照文章中的描述编写了自己的 EnhancedStatusAssert。

public class EnhancedStatusAssert extends AbstractAssert<EnhancedStatusAssert, ApplicationException> {

    public EnhancedStatusAssert(ApplicationException actual) {
        super(actual, EnhancedStatusAssert.class);
    }

public static EnhancedStatusAssert assertThat(ApplicationException actual) {
    return new EnhancedStatusAssert(actual);
}

    public EnhancedStatusAssert hasEnhancedCause(String enhancedStatus) {
        isNotNull();

        // check condition
        if (!actual.enhancedStatus().equals(enhancedStatus)) {
            failWithMessage("Expected enhanced status to be <%s> but was <%s>", enhancedStatus, actual.enhancedStatus());
        }

        return this;
    }
}

哪个工作正常,但我无法覆盖 assertThatThrownBy

assertThatThrownBy(() -> { throw new ApplicationException()})
    .isInstanceOf(ApplicationException.class)
    .hasEnhancedCause("cause");

如何到达运行?

谢谢, 马库斯

尝试使用 asInstanceOf https://assertj.github.io/doc/#assertj-core-3.13.0-asInstanceOf 您可以为您的 ApplicationException 编写自己的 InstanceOfAssertFactory

如果您只有一个字段需要检查,您可以使用 ... extracting 提取它,并对提取的值进行链式断言。