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 문서를 참조하세요.