[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 없음)” 이며 never
javadoc이 여기에 있습니다 .
답변
다음 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);
}
모의 객체 또는 모의 객체 배열에서 이들 중 하나를 사용하여 모의 객체를 사용하여 호출 된 메소드가 없는지 확인할 수 있습니다.