파라미터가 다른 여러 메서드콜을 확인하는 방법
동작을 검증하고 싶은 방법은 다음과 같습니다.
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
'programing' 카테고리의 다른 글
MySQL : ERROR 1215 (HY000) :외부 키 제약 조건을 추가할 수 없습니다. (0) | 2022.11.21 |
---|---|
Vuejs 및 Vuex 어레이에 무선 입력 값만 입력하는 방법 (0) | 2022.11.21 |
조인에서 모든 열 이름 앞에 열 이름의 원본 테이블을 붙이는 방법 (0) | 2022.11.21 |
Android에서 문자열 첨자 및 상위 첨자 (0) | 2022.11.21 |
iPython의 판다 라이브러리를 사용하여 .xlsx 파일을 읽는 방법은 무엇입니까? (0) | 2022.11.21 |