| 종류 | 형식 | 예시 |
|---|---|---|
| 단위 테스트 | {클래스명}Test |
UserServiceTest |
| 통합 테스트 | {클래스명}IntegrationTest |
UserServiceIntegrationTest |
Given-When-Then 패턴 사용
@Test
@DisplayName("사용자 ID로 조회 시 존재하지 않으면 예외 발생")
void givenInvalidUserId_whenFindUser_thenThrowsException() {
// given
Long invalidUserId = 999L;
// when & then
assertThrows(UserNotFoundException.class,
() -> userService.findById(invalidUserId));
}- 메서드명:
given{조건}_when{행위}_then{결과} - 한글
@DisplayName필수
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock // Mock 객체
private UserRepository userRepository;
@InjectMocks // 테스트할 클래스, Mock객체를 찾아서 의존성 주입을 해줌
private UserService userService;
}@SpringBootTest
@AutoConfigureMockMvc
@Transactional
class UserApiIntegrationTest {
@Autowired
private MockMvc mockMvc;
}@DataJpaTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
}Replace.NONE: 기존 DB 그대로 사용 (제거 시 H2 메모리 DB로 대체)@ActiveProfile("test"): application-test.yml 사용
public class UserFixture {
public static User createDefaultUser() {
return User.builder()
.email("test@example.com")
.name("테스트유저")
.build();
}
public static User createUserWithId(Long id) {
return User.builder()
.id(id)
.email("test@example.com")
.name("테스트유저")
.build();
}
}- 테스트용 데이터를 생성하는 클래스
- 다른 테스트용 기능이 필요하면 Util 클래스 생성 가능
assertThat(user.getName()).isEqualTo("홍길동");
assertThat(users).hasSize(3)
.extracting("name")
.containsExactly("홍길동", "김철수", "이영희");assertEquals("홍길동", user.getName());
assertTrue(users.size() == 3);- JUnit 공식 문서에서도 AssertJ 권장
- IntelliJ 자동완성 시 import 확인 필수
@Test
@DisplayName("설명")
void testMethodName() {
// given - 테스트 데이터, Mock 설정
// when - 테스트할 메서드 실행
// then - 결과 검증
}- when과 then 분리가 애매한 경우
// when & then으로 합쳐서 작성