모의가 아닌 객체의 메서드가 호출되었는지 확인하는 방법은 무엇입니까?


103

mockito는 mock 객체의 메서드가 호출되는지 여부 만 확인하고 mock 객체는 항상 다음과 같은 것을 가지고 있는지 확인합니다. doReturn().when(mock object)

하지만 모의 객체를 만들고 정의한 doReturn().when(mock object) 다음 다른 객체의 메서드가 호출되었는지 확인할 수 있습니까?

내가 원하는 것은 다음과 같습니다. mockEnvironment를 정의하고 어떤 일이 발생하더라도 응답을 반환합니다. 하지만 다른 경우에 anotherObj의 다른 메서드가 호출되는지 확인하고 싶습니다.

그렇게하는 방법?

public class BaseClass {
    private Environment mockEnvironment;
    @Test
    public void testcase () {
     setMockitoEnvironment(); 
     response = foo(mockEnvironment, argument1);
     verify(anotherObj).codePath1(...);
     response = foo(mockEnvironment, argument2);
     verify(anotherObj).codePath2(...);
   }
}

//this method successfully return a response with any input 
//because I do not care how response is eventually generated, 
//I only care whether code path reaches createResponse() via 
//code path 1 or code path 2.
private void setMockitoEnvironment() {
    mockEnvironment = mock(Environment.class);
    doReturn (response).when(mockEnvironment).createResponse(for any input);
}
private Response foo(...) {
    ... 
    return createResponse(...);
}

답변:


121

이를 위해 Mockito Spy 를 사용할 수 있습니다 . anotherObj스파이로 설정 하면 해당 개체에 대한 메서드 호출을 확인할 수 있습니다. 귀하의 예제에서는 호출이 foo일반적인 .NET 구현 대신 스파이 를 사용 하는지 확인해야합니다 anotherObj. 스파이는 다음과 같이 설정됩니다.

AnotherClass anotherObjSpy = Mockito.spy(new AnotherClass());
// do stuff -- e.g. anotherObjSpy.foo(...);
verify(anotherObjSpy).codePath1(...);

즉, 여러 항목을 확인하려면 모의 개체를 여러 개 만들고 주입해야 할 수 있습니다. 그것은 편리하지 않습니다.
user389955

@ user389955 예, 스파이로 확인하려는 각 개체를 설정해야합니다. 내가 아는 한 그 주위에는 방법이 없습니다. Mockito는 객체에 프록시를 추가해야하며 누군가 프록시 할 객체를 Mockito에게 알려야합니다.
K Erlandsson 2015 년

10
"// 할 일"을 말하는 대신 테스트 할 메서드 호출을 수행해야하는 "anotherObjSpy"를 추가하는 것이 도움이 될 수 있습니다.
jwehrle

감사합니다 @jwehrle, 호출에서 anotherObjSpy를 사용해야합니다. 그렇지 않으면 테스트가 작동하지 않습니다.
argoth dec.

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