[java] Mockito 던져진 예외를 조롱하고 주장하는 방법?

junit 테스트에서 mockito를 사용하고 있습니다. 예외를 발생시킨 다음 예외가 발생했다고 주장하는 방법 (일반적인 의사 코드)



답변

BDD 스타일 솔루션 (Java 8로 업데이트)

Mockito 만으로는 예외 처리를위한 최상의 솔루션이 아닙니다. Catch-Exception 과 함께 Mockito 를 사용 하십시오.

모키 토 + 캐치 예외 + AssertJ

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

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

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

샘플 코드

의존성


답변

두 번째 질문에 먼저 답하십시오. JUnit 4를 사용하는 경우 테스트에 주석을 달 수 있습니다

@Test(expected=MyException.class)

예외가 발생했다고 주장합니다. 그리고 mockito로 예외를 “모의”하려면

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


답변

예외 메시지도 테스트하려면 Mockito와 함께 JUnit의 ExpectedException을 사용할 수 있습니다.

@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"));
}


답변

2015 년 6 월 19 일에 대한 답변이 업데이트되었습니다 (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


답변

JUnit 4 및 Mockito 1.10.x를 사용하는 경우 다음과 같이 테스트 방법에 주석을 답니다.

@Test(expected = AnyException.class)

원하는 예외 사용을 던지기 위해 :

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


답변

다음과 같이 예외가 발생하도록하십시오.

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

테스트에서 이러한 예외가 발생한다고 주장하여 문제가 발생했는지 확인하십시오.

@Test(expected = AnException.class)

또는 일반적인 모의 검증으로 :

verify(obj).someMethod();

테스트가 중간 코드가 예외를 처리하도록 증명하도록 설계된 경우 후자의 옵션이 필요합니다 (예 : 테스트 메소드에서 예외가 발생하지 않음).


답변

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);
}