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); } }