Stub
- 호출에 대해 미리 고정된 응답을 제공하는 것
- 상태 기반 테스트에 사용
- 예: 데이터베이스와 통신하는 코드를 테스트할 때, 실제로 DB와 연결하지 않고, 미리 정의된 데이터를 반환하도록 설정.
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public String getUserName(Long userId) {
return userRepository.findNameById(userId);
}
}
public interface UserRepository {
String findNameById(Long userId);
}
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(MockitoExtension.class) // Mockito 확장 적용
public class UserServiceStubTest {
@Test
void testGetUserNameWithStub() {
UserRepository userRepositoryStub = new UserRepository() {
@Override
public String findNameById(Long userId) {
return "Stub User";
}
};
UserService userService = new UserService(userRepositoryStub);
String result = userService.getUserName(1L);
assertEquals("Stub User", result);
}
}
Mock
- 행동을 검증하기 위한 객체로, 메서드 호출 여부와 그에 대한 상호작용을 검증
- 행동 기반 테스트에 사용
- 예: 특정 API 호출을 테스트할 때, 해당 API가 제대로 호출되었는지와 호출된 매개변수, 호출 횟수를 검증하는 테스트에 사용.
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class UserService {
private final NotificationService notificationService;
public void registerUser(Long userId) {
notificationService.sendNotification(userId, "Welcome!");
}
}
public interface NotificationService {
void sendNotification(Long userId, String message);
}
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.mockito.Mockito.*;
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private NotificationService notificationService;
@InjectMocks
private UserService userService;
@Test
void testRegisterUserWithMock() {
userService.registerUser(1L);
verify(notificationService, times(1)).sendNotification(1L, "Welcome!");
}
}
728x90
반응형
'TDD' 카테고리의 다른 글
TDD 사이클 (0) | 2024.09.16 |
---|---|
Test Smell 처리 방법 (0) | 2024.09.09 |
좋은 테스트의 요건 - RIGHT BICEP (0) | 2024.08.31 |
좋은 테스트의 요건 - FIRST (0) | 2024.08.31 |
단위 테스트의 기초 (0) | 2024.08.21 |