[java] Mockito를 사용하여 특정 메소드 호출 시 인자들이 지정한 범위 내의 값인지 확인하는 방법은?
import org.mockito.ArgumentMatcher;

public class RangeArgumentMatcher<T extends Comparable<T>> implements ArgumentMatcher<T> {
    private final T lower;
    private final T upper;

    public RangeArgumentMatcher(T lower, T upper) {
        this.lower = lower;
        this.upper = upper;
    }

    @Override
    public boolean matches(T argument) {
        return argument.compareTo(lower) >= 0 && argument.compareTo(upper) <= 0;
    }
}

위의 코드는 Mockito에서 사용할 수 있는 ArgumentMatcher 구현체인 RangeArgumentMatcher 클래스입니다. 이 클래스는 주어진 범위 내의 값인지 확인하기 위해 사용됩니다.

이제 Mockito를 사용하여 실제 테스트에서 이 RangeArgumentMatcher를 활용해보겠습니다. 예를 들어, 다음과 같은 메소드가 있는 Calculator 클래스가 있다고 가정해봅시다.

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }
}

그리고 이 메소드의 호출 시 인자들이 특정 범위 내에 있는지 확인하는 테스트를 작성해보겠습니다.

import org.junit.Test;
import org.mockito.Mockito;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;

public class CalculatorTest {
    @Test
    public void testAddWithInRange() {
        Calculator calculator = Mockito.mock(Calculator.class);
        when(calculator.add(argThat(new RangeArgumentMatcher<>(10, 100)), anyInt()))
                .thenReturn(42);

        int result = calculator.add(50, 5);

        assertEquals(42, result);
        verify(calculator).add(argThat(new RangeArgumentMatcher<>(10, 100)), anyInt());
    }
}

위의 코드에서 when 구문을 사용하여 Calculator 클래스의 add 메소드를 호출할 때 첫 번째 인자가 10부터 100 사이의 값인지 확인하도록 설정했습니다. 그리고 thenReturn을 사용하여 이 테스트 시나리오에서 add 메소드가 호출될 때 42를 반환하도록 설정했습니다.

마지막으로, assertEquals를 사용하여 실제 결과와 기대하는 결과가 일치하는지 확인하고, verify를 사용하여 add 메소드가 RangeArgumentMatcher와 함께 호출되는지 검증합니다.

이렇게 Mockito의 ArgumentMatcherRangeArgumentMatcher를 활용하여 특정 메소드 호출 시 인자들이 지정한 범위 내의 값인지 확인할 수 있습니다.


참고문서: