[java] Mockito를 사용하여 특정 메소드가 호출되지 않았는지 확인하는 방법은 무엇입니까?

객체의 의존성에 대해 메소드가 호출 되지 않았는지 확인하는 방법 ?

예를 들면 다음과 같습니다.

public interface Dependency {
    void someMethod();
}

public class Foo {
    public bar(final Dependency d) {
        ...
    }
}

Foo 테스트를 통해 :

public class FooTest {
    @Test
    public void dependencyIsNotCalled() {
        final Foo foo = new Foo(...);
        final Dependency dependency = mock(Dependency.class);
        foo.bar(dependency);
        **// verify here that someMethod was not called??**
    }
}



답변

더 의미있는 :

import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;

// ...

verify(dependency, never()).someMethod();

이 기능의 문서는 §4 “정확한 호출 횟수 확인 (적어도 x / never 없음)” 이며 neverjavadoc이 여기에 있습니다 .


답변

다음 Mockito.verify과 같이 메소드 에서 두 번째 인수를 사용하십시오 .

verify(dependency, Mockito.times(0)).someMethod()


답변

더 일반적인 패턴으로 @After테스트에서 블록 을 사용하는 경향이 있습니다 .

@After
public void after() {
    verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}

그런 다음 테스트는 무엇 호출 해야하는지 자유롭게 확인할 수 있습니다.

또한, 나는 종종 “상호 작용 없음”을 확인하는 것을 잊어 버렸으며, 나중에는해서는 안될 것들이 발견되었다는 것을 알게되었습니다.

따라서이 패턴은 구체적으로 확인되지 않은 모든 예상치 못한 전화를 잡는 데 유용합니다.


답변

우선 : 항상 mockito static을 가져와야합니다.이 방법으로 코드를 훨씬 더 읽기 쉽고 직관적으로 만들 수 있습니다

import static org.mockito.Mockito.*;

실제로 이것을 달성하는 방법은 여러 가지가 있지만 (아마도) 사용하는 것이 더 깨끗합니다.

verify(yourMock, times(0)).someMethod();

다른 테스트에서는 다음과 같이 특정 양의 실행을 주장하는 데 사용합니다.

verify(yourMock, times(5)).someMethod();

대안은 다음과 같습니다.

verify(yourMock, never()).someMethod();

또는-특정 조롱 된 객체가 실제로 호출되지 않도록하려면 다음을 사용할 수 있습니다.

verifyZeroInteractions(yourMock)


답변

모두 verifyNoMoreInteractions()verifyZeroInteractions()방법은 내부적으로 동일한 구현 등이있다 :

public static transient void verifyNoMoreInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

public static transient void verifyZeroInteractions(Object mocks[])
{
    MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}

모의 객체 또는 모의 객체 배열에서 이들 중 하나를 사용하여 모의 객체를 사용하여 호출 된 메소드가 없는지 확인할 수 있습니다.


답변