Spring Boot는 효과적인 테스트를 위한 다양한 유틸리티와 어노테이션을 제공합니다. 그 중 @DataJpaTest
와 @SpringBootTest
는 각각 데이터 액세스 계층과 전체 애플리케이션 컨텍스트의 테스트에 중점을 둡니다.
@DataJpaTest
📚@Repository
어노테이션을 가진 빈들을 자동 스캔@SpringBootTest
🌍@Controller, @Service, @Repository
등 모든 빈 로드@NoArgsConstructor
@Data
@Entity
public class MyUser {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
private Long id;
private String name;
public MyUser(String name) {
this.name = name;
}
}
@RequiredArgsConstructor
@Service
public class MyService {
private final MyRepository myRepository;
public void saveData(String name) {
myRepository.save(new MyUser(name));
}
}
@Repository
public interface MyRepository extends JpaRepository<MyUser,Long> {
}
@SpringBootTest
사용 예시@SpringBootTest
를 사용하여 MyService
의 전체 동작을 테스트합니다. 모든 빈이 등록되므로 필요한 컴포넌트를 자유롭게 주입받아 사용할 수 있습니다.
@SpringBootTest
class MyServiceTest {
@Autowired
private MyRepository repository;
@Autowired
private MyService service;
@Test
void t1() {
}
}
//성공!!
정상동작 하는 것을 확인 할 수 있습니다.
@DataJpaTest
사용 예시@DataJpaTest
를 사용하면 MyRepository
와 같은 JPA 관련 구성 요소만 테스트에 포함됩니다.
@DataJpaTest
class MyRepositoryTest {
@Autowired
private MyRepository repository;
@Autowired
private MyService service;
@Test
void t1() {
}
}
//실패!!
org.springframework.beans.factory.UnsatisfiedDependencyException
이 발생!!! (expected at least 1 bean which qualifies as autowire candidate)😰
@DataJpaTest
는 Repsitory만을 올리기에 Service는 없다고 나오는 것이 정상입니다.
private MyService service
를 없애고 다시 실행한다면 초록 불을 보실 수 있습니다.
@DataJpaTest
와 @SpringBootTest
는 각각의 목적에 맞게 사용되어야 합니다. 데이터 액세스 레이어에 집중하는 경우 @DataJpaTest
를, 애플리케이션의 전체적인 통합 테스트를 원할 때는 @SpringBootTest
를 선택해야 합니다.
상황에 알맞게 선택하여 사용한다면 더욱 효과적인 테스트를 작성 할 수 있습니다.