Search
Duplicate
📒

[Spring TDD] 01-2. 테스트 더블

상태
완료
수업
Spring TDD
주제
Test
4 more properties
참고

테스트 더블 (Test Double)

NOTE
테스트를 진행하기 어려운 경우 이를 대신해 테스트를 진행할 수 있도록 만들어주는 객체를 말한다!
ex) 데이터베이스와 같이 공유자원을 사용하는 경우, 순서에따라 다른 결과를 유발한다. ⇒ 이런 연관된 객체를 사용하기 어려울때 사용하는게 테스트 더블!
테스트 더블의 종류
Dummy
Fake
Stub
Spy
Mock

1. Dummy

NOTE
가장 기본적인 테스트 더블, 인스턴스화된 객체가 필요하지만 기능이 필요하지 않은경우 사용한다!
// 실제 인터페이스 public interface PringWarning{ void print(); } // Dummy 구현 public class PrintWarningDummy implments PrintWarning { @Override public void print() { // 아무런 동작을 하지 않는다. } }
Java
복사
이 경우 pinrt()가 아무런 동작을 하지 않아도 테스트에 영향을 미치지 않는다.

2. Fake

NOTE
동작은 하지만 실제 사용되는 객체처럼 정교하게 동작하지 않는 객체이다!
그냥 객체참고용
public interface UserRepository { void save(User user); User findById(long id); } public class FakeUserRepository implements UserRepository { private Collection<User> users = new ArrayList<>(); @Override public void save(User user) { if (findById(user.getId()) == null) { user.add(user); } } @Override public User findById(long id) { for (User user : users) { if (user.getId() == id) { return user; } } return null; } }
Java
복사
실제 DB에 연결하지 않고, 동일하게 동작시킴!

3. Stub

NOTE
Dummy 객체가 실제로 동작하는 것 처럼 보이게 만들어 놓은 객체이다!
실제 DB를 사용하지 않고 사용한것처럼 응답해줌
public class StubUserRepository implements UserRepository { // ... @Override public User findById(long id) { return new User(id, "Test User"); } }
Java
복사
언제나 동일한 ID값에 Test User라는 이름을 가진 User 인스턴스를 반환 받는다.
테스트에서 자주 사용되는 Mockito 프레임워크도 Stub와 같은 역할을 해준다!
테스트를 위해 의도한 결과만 반환되도록 하기 위한 객체 ⇒ Stub

4. Spy

NOTE
Stub의 역할을 가지면서 호출된 내용에 대해 약간의 정보를 기록한다!
public class MailingService { private int sendMailCount = 0; private Collection<Mail> mails = new ArrayList<>(); public void sendMail(Mail mail) { sendMailCount++; mails.add(mail); } public long getSendMailCount() { return sendMailCount; } }
Java
복사
sendMailCount를 기록한다!
자기 자신이 호출된 상황을 확인할 수 있는 객체 ⇒ Spy
Mockito 프레임워크의 verify() 메서드가 같은 역할을 해준다.

5. Mock

NOTE
호출에 대한 기대를 명세하고 내용에 따라 동작하도록 프로그래밍 된 객체이다.
명세에 따라 동작하도록한다.
@ExtendWith(MockitoExtension.class) public class UserServiceTest { @Mock private UserRepository userRepository; @Test void test() { when(userRepository.findById(anyLong())).thenReturn(new User(1, "Test User")); User actual = userService.findById(1); assertThat(actual.getId()).isEqualTo(1); assertThat(actual.getName()).isEqualTo("Test User"); } }
Java
복사
Springboot Mockito 사용예시 ⇒ 조회시 1번 유저를 반환시켜서 검증한다.