4.1 방법 매개변수
모의 개체에 추가된 이전 규칙은 매개 변수가 없는 메서드를 처리했습니다. 매개변수가 있는 메서드에 대한 규칙을 만드는 방법은 무엇입니까? 또한 일부 매개 변수 값에 대해 하나의 결과가 있고 다른 결과에 대해 다른 결과가 있도록 규칙을 만들고 싶습니다.
그렇게 하면 여러분도 할 수 있습니다. 메서드가 특정 매개 변수를 사용하여 특정 항목을 반환하도록 하려면 규칙을 다음과 같이 작성할 수 있습니다.
Mockito.doReturn(result).when(an object).method name(parameter);
더 잘 이해하기 위해 예를 살펴보겠습니다. List가 10번째 요소를 요청할 때 Ivan이라는 이름을 반환하고 500번째 요소를 요청할 때 Marya라는 이름을 반환하도록 합니다. 말한 것보다 빨리.
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//adding the first rule
Mockito.doReturn("Ivan").when(mockList).get(10);
//adding a second rule
Mockito.doReturn("Maria").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Maria", mockList.get(500));
}
}
4.2 매개변수 템플릿
그리고 즉시 교활한 동료가 "메서드에 인수가 필요하지만 어떤 값에 대해서도 동일한 결과를 반환해야 하는 경우 어떻게 해야 합니까?"라는 질문을 할 것입니다. 쓰지 말자:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
아니요, 아무도 당신에게 그렇게 쓰라고 강요하지 않습니다. 인수가 있는 메서드에 대해 작동하는 모의 개체에 규칙을 추가하려는 경우 이를 위한 특수 개체가 있습니다.
Mockito.any()
우리의 예는 다음과 같이 작성됩니다.
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
여기에는 몇 가지 뉘앙스가 있습니다. 개체에는 Mockito.any()
유형이 있으므로 Object
다른 유형의 매개변수에 대한 유사어가 있습니다.
방법 | 매개변수 유형 | |
---|---|---|
1 | 어느() | null을 포함하는 개체 |
2 | any(클래스명.클래스) | 클래스 이름 |
삼 | 임의의 정수() | 정수 |
4 | 모든 부울() | 부울 |
5 | 모든 더블() | 더블 |
6 | 애니리스트() | 목록 |
보다 정확하게, 우리의 예는 다음과 같을 것입니다:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 doAnswer() 메서드
우리는 가상 메서드의 복잡한 동작에 도달했습니다. 조만간 이 가상 메서드가 복잡한 동작을 갖기를 원하는 상황이 올 것입니다. 예를 들어 매개 변수에 따라 값을 반환하고 문자열을 대문자로 변환해야 합니다.
이를 위한 특별한 방법이 있습니다 - doAnswer()
. 필요한 작업을 수행하는 함수가 전달됩니다.
Mockito.doAnswer(function).when(an object).method name(parameter);
get()
클래스 메서드가 List
전달된 인수의 제곱을 반환 하도록 합시다 . 그리고 다음 프로그램을 작성합니다.
@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.doAnswer(invocation -> {
int parameter = invocation.getArgument(0);
return parameter * parameter;
}).when(mockList).get(anyInt());
assertEquals(100, mockList.get(10));
assertEquals(25, mockList.get(5));
}
}
Answer 클래스의 객체를 사용하여 함수를 정의했습니다.