[java] PowerMock에서의 스텁과 스파이(mockito spy)의 차이

PowerMock는 Mockito와 함께 사용하는 도구로, 테스트에서 일부 클래스의 정적 메소드나 생성자를 모의(mock)할 수 있게 해줍니다. 이러한 기능을 사용하여 테스트를 작성할 때, 스텁(stub)과 스파이(spy)라는 두 가지 방식을 이용할 수 있습니다.

스텁(stub)이란?

스텁은 모의 객체가 호출될 때 특정한 값을 반환하도록 지정하는 기능입니다. 즉, 메소드 호출에 대한 출력을 미리 설정하여 테스트에서 원하는 값을 반환하도록 하는 것입니다. 예를 들어, 다음과 같은 코드가 있다고 가정해봅시다.

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

스텁을 사용하여 add 메소드가 호출되면 항상 10을 반환하도록 만들 수 있습니다.

Calculator calculator = Mockito.mock(Calculator.class);
Mockito.when(calculator.add(Mockito.anyInt(), Mockito.anyInt())).thenReturn(10);

int result = calculator.add(2, 3); // result는 10이 됨

스파이(spy)란?

스파이는 실제 객체의 일부 메소드를 호출하면서 해당 메소드의 호출 내역을 기록하는 기능입니다. 스파이는 실제 객체의 동작을 유지하면서 메소드 호출에 대한 정보를 효과적으로 확인할 수 있습니다. 예를 들어, 다음과 같은 코드가 있다고 가정해봅시다.

public class BankAccount {
    private int balance;

    public void deposit(int amount) {
        balance += amount;
    }

    public int getBalance() {
        return balance;
    }
}

스파이를 사용하여 deposit 메소드가 호출될 때마다 호출 횟수를 카운트할 수 있습니다.

BankAccount account = new BankAccount();
BankAccount spy = Mockito.spy(account);

spy.deposit(100);
spy.deposit(200);

Mockito.verify(spy, Mockito.times(2)).deposit(Mockito.anyInt()); // deposit 메소드는 총 2번 호출됨

스텁과 스파이의 차이점

결론

PowerMock를 사용하여 테스트를 작성할 때, 스텁과 스파이는 각각 다른 목적과 기능을 가지고 있습니다. 스텁은 메소드의 반환 값을 조작하여 테스트를 간편하게 만들고, 스파이는 실제 동작을 유지하면서 메소드 호출 내역을 확인할 수 있습니다. 적절한 상황에 맞게 사용하여 테스트 코드를 작성해야 합니다.

참고 자료