[java] Mockito에서 Stubbing이란 무엇인가?

Mockito는 자바에서 유닛 테스트를 작성할 때 많이 사용되는 mocking 프레임워크입니다. Mockito를 사용하면 테스트 대상 객체를 가짜 객체로 대체하여 의존성을 가지는 객체들을 테스트할 수 있습니다. 이렇게 가짜 객체를 만들어 사용하는데, 이때 Stubbing이란 개념이 등장합니다.

Stubbing은 테스트를 진행할 때 가짜 객체에 대해 어떤 행동을 하도록 지정하는 작업을 말합니다. 즉, 특정 메서드를 호출할 때 가짜 객체가 이에 맞는 동작을 하도록 설정하는 것입니다. 이렇게 하면 실제 객체를 사용하지 않고도, 원하는 동작을 시뮬레이션하거나, 특정 조건에 따라 다른 결과를 반환할 수 있습니다.

예를 들어, 다음과 같은 코드를 생각해보겠습니다:

public class UserService {
    private UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public boolean isValidUser(String username) {
        User user = userRepository.findUserByUsername(username);
        return user != null && user.isActive();
    }
}

위 코드에서 UserServiceisValidUser 메서드를 테스트하려면 userRepository 객체를 mocking하여 가짜 객체로 대체해야 합니다. 또한 가짜 객체의 findUserByUsername 메서드가 실제로 동작하도록 설정해야 합니다.

Mockito를 사용하여 Stubbing을 수행하는 코드는 다음과 같습니다:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testIsValidUser() {
        User fakeUser = new User("john", true);
        Mockito.when(userRepository.findUserByUsername("john"))
                .thenReturn(fakeUser);

        boolean isValid = userService.isValidUser("john");

        assertTrue(isValid);
    }
}

위의 예제에서 Mockito.when() 메서드를 사용하여 userRepository.findUserByUsername("john") 메서드가 호출되었을 때, fakeUser 객체를 반환하도록 Stubbing을 설정했습니다. 그리고 userService.isValidUser("john")을 호출하여 반환값이 예상대로 true인지 검증하고 있습니다.

Mockito를 사용하면 Stubbing을 통해 원하는 동작을 가진 가짜 객체를 쉽게 생성할 수 있으며, 이를 통해 테스트 코드의 유지보수성을 높일 수 있습니다.

참고 자료