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


625

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

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

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??**
    }
}

답변:


1087

더 의미있는 :

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

// ...

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

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


144
사용은 never최고의 가장 구체적인 방법이지만 전체 모의 개체를 확인해야하는 경우도 고려 verifyZeroInteractions(mockObject)verifyNoMoreInteractions(mockObject).
Jeff Bowman

someMethod가 비공개 인 경우 어떻게해야합니까?
Kumar Saha

1
그런 다음 (Mockito를 사용하여) 처음에는 그것을 조롱 할 수 없습니다.) PowerMock은 그것을 허용하지만 설정하기가 더 복잡합니다. 또는 코드 소유권이 있으면 패키지에 대한 가시성을 완화 할 수 있습니다.
Brice

2
3.0.1부터는 verifyZeroInteractions더 이상 사용되지 않습니다. verifyNoInteractions 제안 된 대안입니다. 이 의견에 당시 Mockito 버전은 3.3.3
VKB

108

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

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


11
공개 정적 검증 모드 never () {반환 횟수 (0); }
gbero

3
never()보다 읽기가 쉽지 않습니다 times(0). 그러나 그것의 존재는 never인지 부하를 증가시키고 mockito 시스템을 이해하고 사용하는 방법을 기억하기 어렵게 만듭니다. 따라서 실제로 mockito는 neverAPI에 포함되어서는 안되며 정신 비용이 들지 않습니다.
BT

질문 :이 양식 someMethod은 0 번 호출 된 것을 확인 someMethod합니까, 아니면 인수가 0으로 호출되지 않은 것만 확인 합니까?
BT

@ BT- someMethod0 인수로 0 번이라고 확인 함 을 상상합니다. 확인 되지 않았습니다.
beluchin

18

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

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

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

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

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


9
Mockito 문서는이 패턴이 남용되어서는 안된다고 말합니다. "경고의 말 : 많은 클래식, 기대-실행-확인 모의를 한 일부 사용자는 모든 테스트 방법 에서조차 verifyNoMoreInteractions ()를 자주 사용하는 경향이 있습니다. ()은 모든 테스트 방법에 사용하는 것이 권장되지 않습니다. verifyNoMoreInteractions ()는 상호 작용 테스트 툴킷의 편리한 어설 션입니다. 관련성이있을 때만 사용하십시오.이를 사용하면 과도하게 지정되고 유지 보수가 어려운 테스트가 발생합니다. " 여기를
Chadi

2
"관련이있을 때만 사용하십시오". 항상 관련이 있다고 생각합니다. 나는 그 패턴을 남용으로 보지 않는다. 내가 말했듯이, "무엇을해서는 안되는 것들"이 발견되었다. 나에게는 이것이 중요한 검증이다. 무언가 사용하지 말아야 할 저장소를 호출하고 있다면 그것에 대해 알고 싶다! verifyNoMoreInteractions? 를 사용하지 않고 확인하는 다른 방법이 없다면 ? 여기에있는 다른 답변은 테스트 작성자가 이러한 검사를 명시 적으로 기억한다는 것을 의지합니다. 내 책에는 너무 오류가 발생하기 쉽습니다.
David Lavender

2
나는이 의견을 보았지만 추론이 설득력이없는 것처럼 느꼈다. 이것이 권장되지 않는 이유에 대해 자세히 알고 싶습니다.
tobinibot

2
@tobinibot 단위 테스트의 아이디어는 계약을 확인하는 것입니다. 대부분의 계약에는 일반적으로 다른 방법이 몇 번이나 호출되는지가 아니라 알려진 매개 변수를 전달하면 알려진 응답이 발생합니다. 더 이상 상호 작용을 사용하지 않으면 기본적으로 구현을 한 줄씩 확인하므로 리팩토링 및 구현이 지루합니다. 단위 테스트의 요점이 아닙니다.
앤드류 T 피넬

8

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

import static org.mockito.Mockito.*;

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

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

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

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

대안은 다음과 같습니다.

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

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

verifyZeroInteractions(yourMock)

7

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.