programing

파라미터가 다른 여러 메서드콜을 확인하는 방법

randomtip 2022. 11. 21. 22:27
반응형

파라미터가 다른 여러 메서드콜을 확인하는 방법

동작을 검증하고 싶은 방법은 다음과 같습니다.

public void methodToTest(Exception e, ActionErrors errors) {
    ...

    errors.add("exception.message", 
            ActionMessageFactory.createErrorMessage(e.toString()));

    errors.add("exception.detail",
            ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString()));

    ...
}

@Test 수업에서 나는 다음과 같은 것을 하고 싶었다.errors.add()"syslog.message"로 호출되고 다시 "syslog.message"로 호출됩니다.

verify(errors).add(eq("exception.message"), any(ActionError.class));
verify(errors).add(eq("exception.detail"), any(ActionError.class));

그러나 모키토는 다음과 같이 불평한다.

Argument(s) are different! Wanted:
actionErrors.add(
    "exception.message",
    <any>
);

Actual invocation has different arguments:
actionErrors.add(
    "exception.detail",
    org.apache.struts.action.ActionError@38063806
);

어떻게 Mockito에게 두 가지 값을 모두 확인하라고 할 수 있습니까?

더 읽어보니 Argument Captors와 다음 작품들을 사용해 보게 되었습니다. 하지만 제가 원하는 것보다 훨씬 장황한 내용들이었습니다.

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);

verify(errors, atLeastOnce()).add(argument.capture(), any(ActionMessage.class));

List<String> values = argument.getAllValues();

assertTrue(values.contains("exception.message"));
assertTrue(values.contains("exception.detail"));

둘 다 순서가add()콜은 관련성이 있습니다.InOrder:

InOrder inOrder = inOrder(errors);
inOrder.verify(errors).add(eq("exception.message"), any(ActionError.class));
inOrder.verify(errors).add(eq("exception.detail"), any(ActionError.class));

다음과 같은 방법을 사용해 보십시오.

verify(errors, times(2))
     .add(AdditionalMatchers.or(eq("exception.message"), eq("exception.detail")),
          any(ActionError.class));

사용할 수 있습니다.Mockito.atLeastOnce()따라서 mockObject가 여러 번 호출되더라도 Mockito는 테스트를 통과할 수 있습니다.

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(1));

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(2));

코드에 문제가 있을 수 있습니다.사실, 당신은 이 코드를 작성해야 합니다.

Map<Character, String> map = mock(Map.class);

map.put('a', "a");
map.put('b', "b");
map.put('c', "c");

verify(map).put(eq('c'), anyString());
verify(map).put(eq('a'), anyString());
verify(map).put(eq('b'), anyString());

첫 번째 확인은 실제 호출과 관련하여 순서가 맞지 않습니다.

또한 Struts 타입과 같이 자신이 소유하고 있지 않은 타입을 실제로 조롱하지 않는 것을 추천합니다.

[편집 @브래드]

IDE에서 Brice의 코드(위)를 실행한 후 ActionMessage 대신 ActionError를 사용한 것을 알 수 있기 때문에 verify()가 일치하지 않았습니다.제가 처음에 올린 오류 메시지는 그것이 일치하지 않는 첫 번째 주장이라고 오해하게 만들었습니다.그게 두 번째 논쟁이었던 걸로 밝혀졌어요.

그래서 제 질문에 대한 답은

/** 
 * note that ActionMessageFactory.createErrorMessage() returns ActionMessage
 * and ActionError extends ActionMessage
 */
verify(errors).add(eq("exception.message"), any(ActionMessage.class));
verify(errors).add(eq("exception.detail"), any(ActionMessage.class));

OP 코드가 올바릅니다(합계 확인).

=1= Mokito에게 총 통화 예상치를 알립니다.

=2= Mokito에게 각 파라미터의 조합이 예상되는 횟수를 알려준다.(Mokito는 시간이 생략된 경우 시간(1)을 가정합니다).

verify(errors, times(2)).add(any(), any(ActionMessage.class));

verify(errors).add(eq("exception.message"), any());
verify(errors).add(eq("exception.detail"), any());

OP 코드는 정확합니다.필요한 것을 체크합니다.

Prod 코드에 문제가 있었습니다.Prod 코드는 ActionError arg 타입의 첫 번째 arg 조합을 호출하지 않은 것 같습니다.그래서 모키토는 올바르게 불평했다.단, (동의합니다) 여러 통화에 대해 불만 메시지가 혼란스럽습니다.

해결책: (우선) 메서드를 정확히 2회 호출했는지 확인합니다(Arg를 사용).

@sendon1928과 같은 방법으로 다음을 사용할 수 있습니다.

Mockito.times(wantedInvocationCount)

정확한 횟수(내 생각에는 피할 수 없는 해결책)로 불리는 방법을 확인합니다.나중에 전화하면 돼

Mockito.verifyNoMoreInteractions(mock)

그 모의가 더 이상 어떤 문맥에서도 사용되지 않도록 하기 위해.완전한 예:

Mockito.verify(mockObject, Mockito.times(wantedInvocationCount)).testMethod(Mockito.eq(1));

Mockito.verify(mockObject, Mockito.times(wantedInvocationCount)).testMethod(Mockito.eq(2));

Mockito.verifyNoMoreInteractions(mockObject)

언급URL : https://stackoverflow.com/questions/8504074/how-to-verify-multiple-method-calls-with-different-params

반응형