Test Double이란

테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체

ex)) 외부와 통신해서 값을 가져와야 하는 경우 Mocking 처리 등

번외(영화 촬영시 위험한 역할을 하는 스턴트 더블에서 비롯됨)


Test Double 종류

Untitled

테스트 더블은 크게 Dummy, Fake, Stub, Spy, Mock으로 나뉜다.

Dummy

가장 기본적인 테스트 더블 객체이고 **인스턴스화 된 객체만 필요할 경우 사용**한다.

그렇기 때문에 해당 객체의 정상적인 동작은 보장하지 못한다.

Fake

복잡한 로직이나 객체 내부에서 필요로 하는 다른 **외부 객체들의 동작을 단순화하여 구현**한 객체이다.

구현을 갖고는 있지만 실제 Production 환경에서는 적합하지 않다. (단순 구현이기 때문에 정교한 동작 X)

아래처럼 DB와 비슷하게 동작을 하도록 만들 수 있다.

public class FakeUserRepository implements UserRepository {
    private Collection<User> users = new ArrayList<>();
    
    @Override
    public void save(User user) {
        if (findById(user.getId()) == null) {
            user.add(user);
        }
    }
    
    @Override
    public User findById(long id) {
        for (User user : users) {
            if (user.getId() == id) {
                return user;
            }
        }
        return null;
    }
}

Stub

테스트를 위해 **의도한 결과만 반환**하기 위한 객체이다. ex)) mockito를 사용한 stubbing