참고
테스트 더블 (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번 유저를 반환시켜서 검증한다.