[java] JUnit의 테스트 더블 종류

JUnit은 Java 개발자들이 자동화된 테스트를 작성하고 실행하는 데 사용되는 인기 있는 테스팅 프레임워크입니다. 테스트 더블(Test Double)은 테스트에서 다른 객체를 대체하여 독립적으로 실행될 수 있도록 도와줍니다. 이를 통해 테스트의 신뢰성과 효율성을 높일 수 있습니다.

테스트 더블은 다양한 유형으로 분류될 수 있습니다. 다음은 JUnit에서 지원하는 테스트 더블의 주요 유형입니다:

1. Stub

Stub은 호출되면 미리 정의된 결과를 반환하는 가짜 객체입니다. 실제 구현을 가지지 않고, 단순히 테스트 시나리오에 필요한 값을 반환합니다.

public class StubService implements Service {
    public int getValue() {
        return 42;
    }
}

2. Fake

Fake는 실제로 작동하는 구현을 갖춘 테스트 더블입니다. 하지만 실제 구현보다는 단순하고 가벼운 형태를 가지며, 테스트 실행 속도를 향상시킵니다. 파일 시스템이나 데이터베이스와 같은 리소스를 대체할 수 있습니다.

public class FakeDatabase implements Database {
    private List<String> data = new ArrayList<>();
    
    public void store(String value) {
        data.add(value);
    }
    
    public List<String> getAll() {
        return data;
    }
}

3. Mock

Mock은 사전에 정의된 호출과 기대치에 따라 동작하는 객체입니다. 코드 유닛이 다른 객체를 어떻게 상호작용하는지 확인하기 위해 사용됩니다. Mock은 테스트가 호출을 기록하고 확인할 수 있게하여 테스트의 상태를 추적할 수 있도록 합니다.

public class MockService implements Service {
    private int expectedValue;
    private boolean getValueCalled;
    
    public MockService(int expectedValue) {
        this.expectedValue = expectedValue;
    }
    
    public int getValue() {
        getValueCalled = true;
        return expectedValue;
    }
    
    public boolean isGetValueCalled() {
        return getValueCalled;
    }
}

4. Spy

Spy는 실제 객체의 특정 메서드를 실행하는 것을 허용합니다. 외부 리소스에 연결된 코드와 같은 테스트에 유용합니다. 실제로 호출을 수행하며, 호출된 내역을 추적할 수 있습니다.

public class SpyService implements Service {
    private ServiceImpl serviceImpl = new ServiceImpl();
    private boolean connectCalled;
    
    public int getValue() {
        connect();
        return serviceImpl.getValue();
    }
    
    public void connect() {
        connectCalled = true;
        // 실제 외부 리소스에 연결하는 코드
    }
    
    public boolean isConnectCalled() {
        return connectCalled;
    }
}

테스트 더블을 사용하여 JUnit 테스트를 작성하면, 테스트의 의존성을 관리하고 격리시켜 신뢰성 있고 효율적인 테스트를 작성할 수 있습니다.

더 자세한 내용은 JUnit 문서를 참조하세요.