Как проверить, что статический метод выдает исключение, используя AssertJ?

Когда я пытаюсь проверить этот метод

    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

assertThatThrownBy (org.assertj.core.api.ThrowableAssert.ThrowingCallable) в утверждениях не может применяться к (пусто)


То же самое с assertThatExceptionOfType.

Можно ли проверить, что статический метод действительно выдает непроверенное исключение, используя AssertJ? Что я должен изменить в своем тесте?


person Cybex    schedule 08.08.2019    source источник
comment
зачем тебе так тестировать? Используйте ожидаемое исключение. baeldung.com/junit-assert-exception   -  person Stultuske    schedule 08.08.2019
comment
Мы используем JUnit4, и я знаю о @Test(expected = RuntimeException.class), но хотел сделать то же самое, используя AssertJ.   -  person Cybex    schedule 08.08.2019
comment
@Cybex не использует @Test(expected = ...). В основном это похоже на обертывание всего тела метода в try/catch, поэтому тест проходит, если что-либо в тесте выдает это исключение, а не только то, что вы собираетесь тестировать. Таким образом, особенно для непроверенных исключений, ваш тест может показаться пройденным, даже если он не делает то, что вы думаете.   -  person Andy Turner    schedule 08.08.2019
comment
@ Энди Тернер, да, это одна из причин, по которой я хочу перейти на AssertJ.   -  person Cybex    schedule 08.08.2019
comment
@Cybex, но JUnit 4.13 добавляет assertThrows. Не нужно, кхм, выплескивать ребенка вместе с водой из ванны.   -  person Andy Turner    schedule 08.08.2019
comment
@ Энди Тернер Спасибо, я посмотрю на это. Но я думаю, для согласованности было бы лучше придерживаться одной библиотеки (AssertJ).   -  person Cybex    schedule 08.08.2019
comment
AssertJ также позволяет связать другие утверждения после isInstanceOf, например hasMessage, см. assertj. github.io/doc/   -  person Joel Costigliola    schedule 09.08.2019


Ответы (2)


Как показывает ошибка компиляции, этот метод ожидает генерирующий вызываемый объект.

@Test
public void testThrowsAnException()
{
    assertThatThrownBy(() -> validatePostcode("", "")).isInstanceOf(InvalidFieldException.class);
}
person Ben R.    schedule 08.08.2019
comment
Спасибо, именно то, что я искал! - person Cybex; 08.08.2019

изменить на этот путь. вам нужно передать лямбду для проверки с помощью assertj

assertThatThrownBy(()->validatePostcode("","")).isInstanceOf(InvalidFieldException.class);
person Prabhakar Vemulapalli    schedule 08.08.2019
comment
Спасибо! Извините, но ответ выше был первым. - person Cybex; 08.08.2019