[Java] 동일한 인수를 사용하여 같은 메소드를 여러 번 호출 할 때 Mockito 사용하기


Answers

어때?

when( method-call ).thenReturn( value1, value2, value3 );

theyreeturn의 대괄호 안에 원하는만큼 많은 인수를 넣을 수 있습니다. 단, 모든 올바른 형식을 제공해야합니다. 메서드가 처음 호출 될 때 첫 번째 값이 반환되고 두 번째 응답이 반환됩니다. 다른 모든 값을 모두 사용하면 마지막 값이 반복적으로 반환됩니다.

Question

스텁 된 메소드가 후속 호출에서 다른 객체를 반환하도록하는 방법이 있습니까? ExecutorCompletionService 에서 비 결정적인 응답을 테스트하려면이 작업을 수행하고 싶습니다. 즉, 메서드의 반환 순서에 관계없이 테스트하려면 결과가 일정하게 유지됩니다.

테스트 할 코드는 다음과 같습니다.

// Create an completion service so we can group these tasks together
ExecutorCompletionService<T> completionService =
        new ExecutorCompletionService<T>(service);

// Add all these tasks to the completion service
for (Callable<T> t : ts)
    completionService.submit(request);

// As an when each call finished, add it to the response set.
for (int i = 0; i < calls.size(); i ++) {
    try {
        T t = completionService.take().get();
        // do some stuff that I want to test
    } catch (...) { }        
}



doReturn() 메소드 호출을 이와 같이 doReturn() 수도 있습니다.

doReturn(null).doReturn(anotherInstance).when(mock).method();

귀엽지 않아 :)




다음은 다른 메소드 호출에서 다른 인수를 리턴하는 공통 메소드로 사용될 수 있습니다. 우리가해야 할 일은 각 호출에서 객체를 가져와야하는 순서로 배열을 전달해야한다는 것입니다.

@SafeVarargs
public static <Mock> Answer<Mock> getAnswerForSubsequentCalls(final Mock... mockArr) {
    return new Answer<Mock>() {
       private int count=0, size=mockArr.length;
       public Mock answer(InvocationOnMock invocation) throws throwable {
           Mock mock = null;
           for(; count<size && mock==null; count++){
                mock = mockArr[count];
           }

           return mock;    
       } 
    }
}

전의. getAnswerForSubsequentCalls(mock1, mock3, mock2); 첫 번째 호출에서는 mock1 객체를, 두 번째 호출에서는 mock3 객체를, 세 번째 호출에서는 mock2 객체를 반환합니다. when(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2)); 와 같이 사용해야합니다 when(something()).doAnswer(getAnswerForSubsequentCalls(mock1, mock3, mock2)); 이것은 when(something()).thenReturn(mock1, mock3, mock2); 과 거의 비슷합니다 when(something()).thenReturn(mock1, mock3, mock2);