[java] Mockito를 사용하여 특정 메소드 호출 시 특정 값을 인자로 전달하는 방법은?

보통 Mockito를 사용하여 메소드 호출을 검증할 때, 메소드에 전달되는 인자값을 검증하는 방법을 많이 사용합니다. 그러나 때로는 특정 값을 인자로 전달하여 특정 동작을 수행하도록 하고 싶을 때가 있습니다.

이를 위해 Mockito의 when 메소드를 사용하여 특정 메소드 호출 시 원하는 값을 반환하도록 설정할 수 있습니다. 예를 들어, 다음과 같은 코드가 있다고 가정해 봅시다:

public class Service {
  public String getValue(int number) {
    // 어떤 로직이 수행되는 메소드
    return "Value: " + number;
  }
}

이 Service 클래스의 getValue 메소드 호출 시에 “Value: “ 접두사를 추가하는 Mock 객체를 생성하고 싶다고 가정해 봅시다.

@Test
public void testGetValue() {
  Service service = mock(Service.class);

  when(service.getValue(anyInt())).thenAnswer(invocation -> {
    int number = (int) invocation.getArgument(0);
    return "Value: " + number;
  });

  // getValue 메소드 호출
  String result = service.getValue(5);
  assertEquals("Value: 5", result);
}

위의 테스트 코드에서, when(service.getValue(anyInt())) 부분은 Service 클래스의 getValue 메소드가 아무 정수형 인자를 받는 경우를 나타냅니다. thenAnswer 메소드는 getValue 메소드가 호출될 때마다 실행되는 동작을 정의합니다. 이 경우에는 인자로 전달된 값을 읽어와 “Value: “ 접두사를 추가한 다음 반환합니다.

위의 예시 코드에서는 anyInt()를 사용하여 어떤 정수형 인자든지 받아들일 수 있도록 설정했지만, 실제로는 다른 Mockito Matcher 메소드를 사용하여 특정 값에 대한 매칭도 가능합니다. 예를 들어, eq(5)를 사용하여 인자 값이 정확히 5인 경우에만 동작을 정의할 수 있습니다.

이러한 방식으로 Mockito를 사용하여 특정 메소드 호출 시 특정 값을 인자로 전달하는 것이 가능합니다. 테스트 코드에서 이를 활용하여 원하는 동작을 검증할 수 있습니다.

더 자세한 내용은 Mockito 공식 문서를 참조하시기 바랍니다. (reference: Mockito 공식 문서)