如何使用AssertJ验证静态方法是否抛出异常?

12

当我尝试测试这个方法时

    static void validatePostcode(final String postcode, final String addressLine)
    {
        if(! hasValidPostcode(postcode, addressLine)) {
            throw new InvalidFieldException("Postcode is null or empty ");
        }
    }

使用以下测试

    @Test
    public void testThrowsAnException()
    {
        assertThatThrownBy(validatePostcode("", "")).isInstanceOf(InvalidFieldException.class);
    }

我在 IntelliJ 中遇到了这个错误:

Assertions中的 assertThatThrownBy(org.assertj.core.api.ThrowableAssert.ThrowingCallable) 无法应用于 (void)


使用 assertThatExceptionOfType 也是同样的情况。

是否可能使用 AssertJ 测试静态方法是否实际抛出未经检查的异常?我应该在测试中做出哪些改变?


1
你为什么要那样测试呢?使用ExpectedException。https://www.baeldung.com/junit-assert-exception - Stultuske
2
@Cybex 不要使用@Test(expected = ...)。这基本上就像在整个方法体中包装了try/catch一样,因此如果测试中的任何内容抛出该异常,测试就会“通过”,而不仅仅是您想要测试的内容。因此,特别是对于未经检查的异常,即使您认为它正在执行您想要的操作,您的测试也可能显示为已通过。 - Andy Turner
1
@Cybex 但是JUnit 4.13添加了assertThrows。不需要把孩子和洗澡水一起倒掉。 - Andy Turner
@Andy Turner 谢谢,我会看一下的。但是为了保持一致性,最好还是坚持使用一个库(AssertJ)。 - Cybex
1
AssertJ 还允许您在 isInstanceOf 之后链接其他断言,例如 hasMessage,请参见 https://assertj.github.io/doc/#assertj-core-exception-assertions-assertThatThrownBy - Joel Costigliola
显示剩余2条评论
2个回答

19

正如编译错误所示,该方法期望一个可抛出异常的可调用对象。

@Test
public void testThrowsAnException()
{
    assertThatThrownBy(() -> validatePostcode("", "")).isInstanceOf(InvalidFieldException.class);
}

谢谢,这正是我在寻找的! - Cybex

2

更改为这种方式。您需要将lambda传递给assertj进行测试

assertThatThrownBy(()->validatePostcode("","")).isInstanceOf(InvalidFieldException.class);

抱歉,但是上面的回答先到了。谢谢! - Cybex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接