Mockito Как насмехаться и утверждать брошенное исключение?

Я использую mockito в тесте junit. Как вы делаете исключение, а затем утверждаете, что он имеет (общий псевдокод)

Ответ 1

BDD Style Solution

Одно только Mockito - не лучшее решение для обработки исключений, используйте Mockito с Catch-Exception

Mockito + Catch-Exception + AssertJ

given(otherServiceMock.bar()).willThrow(new MyException());

when(() -> myService.foo());

then(caughtException()).isInstanceOf(MyException.class);

Образец кода

зависимости

Ответ 2

Сначала ответьте на свой второй вопрос. Если вы используете JUnit 4, вы можете аннотировать свой тест с помощью

@Test(expected=MyException.class)

чтобы утверждать, что произошло исключение. И для "издевки" исключения с mockito используйте

when(myMock.doSomething()).thenThrow(new MyException());

Ответ 3

Если вы хотите проверить сообщение об исключении, вы также можете использовать JUnit ExpectedException с Mockito:

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void testExceptionMessage() throws Exception {
    expectedException.expect(AnyException.class);
    expectedException.expectMessage("The expected message");

    given(foo.bar()).willThrow(new AnyException("The expected message"));
}

Ответ 4

Сделать исключение таким:

when(obj.someMethod()).thenThrow(new AnException());

Убедитесь, что это произошло либо, утверждая, что ваш тест выдает такое исключение:

@Test(expected = AnException.class)

Или обычной проверкой:

verify(obj).someMethod();

Последняя опция требуется, если ваш тест предназначен для доказательства промежуточного кода, обрабатывающего исключение (т.е. исключение не будет выбрано из вашего тестового метода).

Ответ 5

Если вы используете JUnit 4 и Mockito 1.10.x Аннотируйте свой тестовый метод с помощью:

@Test(expected = AnyException.class)

и для использования искомого исключения:

Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();

Ответ 6

Обновленный ответ за 06/19/2015 (если вы используете java 8)

Просто используйте assertj

Использование assertj-core-3.0.0 + Java 8 Lambdas

@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
                                  .isInstanceOf(IllegalArgumentException.class);
}

Ссылка: http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html

Ответ 7

Используйте Mockito doThrow, а затем поймайте нужное исключение, чтобы утверждать, что оно было сгенерировано позже.

@Test
public void fooShouldThrowMyException() {
    // given
    val myClass = new MyClass();
    val arg = mock(MyArgument.class);
    doThrow(MyException.class).when(arg).argMethod(any());
    Exception exception = null;

    // when
    try {
        myClass.foo(arg);
    } catch (MyException t) {
        exception = t;
    }

    // then
    assertNotNull(exception);
}

Ответ 8

Используя mockito, вы можете сделать исключение.

when(testingClassObj.testSomeMethod).thenThrow(new CustomException());

Используя Junit5, вы можете утверждать исключение, утверждает, генерируется ли это исключение при вызове метода метода.

@Test
@DisplayName("Test assert exception")
void testCustomException(TestInfo testInfo) {
    final ExpectCustomException expectEx = new ExpectCustomException();

     InvalidParameterCountException exception = assertThrows(InvalidParameterCountException.class, () -> {
            expectEx.constructErrorMessage("sample ","error");
        });
    assertEquals("Invalid parametercount: expected=3, passed=2", exception.getMessage());
}

Найти образец здесь: assert exception junit

Ответ 9

Не связанный с mockito, можно поймать исключение и утвердить его свойства. Чтобы убедиться, что это исключение произошло, утвердите ложное условие в блоке try после инструкции, которая генерирует исключение.

Ответ 10

Или, если ваше исключение выдается из конструктора класса:

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void myTest() {    

    exception.expect(MyException.class);
    CustomClass myClass= mock(CustomClass.class);
    doThrow(new MyException("constructor failed")).when(myClass);  

}

Ответ 11

Утвердить сообщением об исключении:

    try {
        MyAgent.getNameByNode("d");
    } catch (Exception e) {
        Assert.assertEquals("Failed to fetch data.", e.getMessage());
    }