Home
Test
테스트 코드 - Dummy, Stub, Spy, Mock, Fake (Test Code, Test Double)
devfoxstar
devfoxstar
December 04, 2022
1 min

Table Of Contents

01
Dummy
02
Stub
03
Spy
04
Mock
05
Fake

Test Code는 각각의 객체를 독립적으로 테스트 해야 합니다.
하지만 실제 운영 객체는 다양한 의존성으로 연결되고 실행됩니다.

이때 Test Double을 활용하면, 독립적인 테스트가 가능합니다.

Test Double은 실제 객체를 대신해서 테스트 객체를 활용하는 방법입니다.
영화 촬영에서 배우들의 대역을 의미하는 Double에서 유래되었습니다.

Test Double
Test Double


Dummy

  • 테스트를 위해 구현한 가짜 객체
  • 객체만 필요하고 기능 구현은 필요 없는 경우
public interface TestRepository {
    void save();
}

public class TestRepositoryDummy implemnts TestRepository {
    @Override
    public void save() {
        
    }
}

Stub

  • Dummy 객체를 실제 동작하는 것처럼 만든 객체
  • 최소한의 기능 구현 방식으로 항상 동일한 값을 반환
  • Mockito 프레임워크도 Stub 방식을 사용
public class StubTestRepository implemnts TestRepository {
    @Override
    public Test findById(long id) {
        return new Test(id, "Test Name");
    }    
}

Spy

  • 테스트 호출 내용을 기록 하는 객체
  • Stub 수준의 최소한의 기능 구현 뿐 아니라 실제 객체처럼 상세 기능 구현도 가능
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;
    }
}

Mock

  • 테스트 호출에 따른 기대 값을 지정하고 결과를 확인하는 객체
  • 특정 동작을 수행하는지 행위를 검증하는 객체
@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");
    }
}

Fake

  • 실제 디비처럼 구현해서 테스트 하는 방법
  • 코드가 구현 전이거나 독립적으로 테스트 할 때 활용하는 객체
  • 실제 객체와 동일한 역할과 기능을 하도록 구현
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);
    }
}

Tags

#Test#TestCode#TestDouble
© 2024, All Rights Reserved.

Quick Links

About Me

Media