TestInitData 클래스는 BeforeEach를 대신하여 Test를 실행할 때마다 새로운 테스트 데이터를 생성하는 클래스이다. → 초반 데이터를 관리할 수 있는 클래스
TestInitData 클래스를 사용하는 이유?
BeforeAll를 사용하게 된다면 테스트 클래스를 생성할 때마다 새로운 BaforeAll 메서드를 생성해야 한다.
어떠한 테스트를 실행하건 최초 한번만 세팅해야 하는 데이터를 미리 만들어 두기 위해 사용한다.
→ 공통의 테스트 데이터는 TestInitData를 사용하고, 각각의 클래스에서 추가해야 할 테스트 데이터는 BeforeEach로 사용한다.
코드를 보자.
@Configuration
@Profile("test") // 이 클래스가 정의된 Bean들은 test모드에서만 활성화
public class TestInitData {
// CommandLineRunner : 주로 앱 실행 직후 초기데이터 세팅 및 초기화에 사용 -> 알아서 나중에 실행됨
@Bean
CommandLineRunner init(UserRepository userRepository) {
return args -> {
SiteUser u1 = SiteUser.builder()
.username("user1")
.password("{noop}1234")
.email("user1@test.com")
.build();
SiteUser u2 = new SiteUser(null, "user2", "{noop}1234", "user2@test.com");
userRepository.saveAll(Arrays.asList(u1, u2));
};
}
}
두번째 줄의 @Profile(”test”)는 이 클래스의 Bean은 test모드에서만 활성된다.
CommandLineRunner은 앱 실행 직후 초기 데이터를 세팅하고 초기화 해준다.
→ BeforeAll과 같다고 생각한다.
그 아래의 코드는 새로운 User를 만드는 것으로 Test진행 시 User1과 User2가 생성된다.
@ActiveProfiles("test") // 테스트 모드 활성화
Test 모드 활성화를 위해 꼭 위의 코드가 필요하고, 위의 코드가 붙어 Test모드가 활성화 되어있을 경우 @Profile(”test”)가 붙은 클래스의 Bean이 실행된다.
테스트해보자.
@Test
@DisplayName("회원 생성")
void t1() {
SiteUser u3 = SiteUser.builder()
.username("user3")
.password("{noop}1234")
.email("user3@test.com")
.build();
SiteUser u4 = new SiteUser(null, "user4", "{noop}1234", "user4@test.com");
userRepository.saveAll(Arrays.asList(u3, u4));
}
새로운 user3과 user4를 만든다. 그 전 CommandLineRunner을 먼저 실행 후 이 테스트가 진행된다는 것을 알 수 있다.
'Spring' 카테고리의 다른 글
[JAVA] JAR과 WAR (0) | 2023.02.06 |
---|---|
[Spring]QueryDSL 적용하기 (0) | 2022.08.29 |
[Spring]기능 - 검색 (0) | 2022.08.25 |
[Spring]기능 - 앵커(anchor) (0) | 2022.08.23 |
[Spring]기능 - 추천 기능 (0) | 2022.08.23 |