Test Code는 각각의 객체를 독립적으로 테스트 해야 합니다.
하지만 실제 운영 객체는 다양한 의존성으로 연결되고 실행됩니다.
이때 Test Double을 활용하면, 독립적인 테스트가 가능합니다.
Test Double은 실제 객체를 대신해서 테스트 객체를 활용하는 방법입니다.
영화 촬영에서 배우들의 대역을 의미하는 Double에서 유래되었습니다.
public interface TestRepository {
void save();
}
public class TestRepositoryDummy implemnts TestRepository {
@Override
public void save() {
}
}
public class StubTestRepository implemnts TestRepository {
@Override
public Test findById(long id) {
return new Test(id, "Test Name");
}
}
public class TestService {
private int testCount = 0;
private List<Test> tests = new ArrayList<>();
public void callTest(Test test) {
testCount++;
tests.add(test);
}
public long getTestCount() {
return testCount;
}
}
@ExtendWith(MockitoExtension.class)
public class TestService {
@Mock
private TestRepository testRepository;
@Test
public void mockTest() {
when(testRepository.findById(anyLong())).thenReturn(new Test(1, "Test Name"));
Test actual = testRepository.findById(1);
assertThat(actual.getId()).isEqualTo(1);
assertThat(actual.getName()).isEqualTo("Test Name");
}
}
public interface TestRepository {
void save(Test test);
long findById(long id)
}
public class FakeTestRepository implemnts TestRepository {
List<Test> tests = new ArrayList<>();
@Override
public void save(Test test) {
tests.add(test);
}
@Override
public Test findById(long id) {
return tests.findById(id);
}
}