SpringBoot 3.1 이후로 testcontainer 를 지원하기 시작하면서 자동 설정기능이 등장했다.
기존 버전에서는 testcontainer를 생성하면서 사용자 id, password 등의 값을 변경하는등 귀찮은 작업들이 필요했지만 @ServiceConnection 어노테이션의 등장으로 이런 것들이 필요 없어 졌다.
아래는 mysql 을 testcontainer 로 띄워서 테스트 하는 예제 이다.
@TestConfiguration(proxyBeanMethods = false)
public class TestContainerConfiguration {
@Bean
@ServiceConnection
MySQLContainer<?> mysqlContainer() {
return new MySQLContainer<>(DockerImageName.parse("mysql:latest")).withReuse(true);
}
}
testcontainer를 정의하고 @ServiceConnection 어노테이션을 붙여주기만 하면 testcontainer 에서 mysql:latest 컨테이너를 띄우고 자동으로 이 컨테이너와 통신하도록 설정 된다.
이제 테스트 코드를 작성할때 아래처럼 설정클래스를 import 하기만 하면된다.
@SpringBootTest
@Import(TestContainerConfiguration.class)
class PopulationScrapLogRepositoryTest {
@Autowired
private PopulationScrapLogRepository populationScrapLogRepository;
@Test
@DisplayName("로그 데이터가 없으면 빈 값을 반환한다.")
@Sql("/sql/population/repository/CREATE_population_scrap_log.sql") //테스트를 위한 초기화 SQL script
void getLastLog_shouldReturn_empty_whenNoLog() {
Optional<PopulationScrapLog> result = populationScrapLogRepository.getLastLog();
assertTrue(result.isEmpty());
}
}
RDB 관련 testcontainer를 사용할때 주의할 점으로, "spring.jpa.hibernate.ddl-auto" 설정을 validate 로 사용하는데 이렇게 하면 Application 이 구동되면서 에러가 발생한다. 따라서 testcontainer를 사용할 때는 none 값으로 설정을 해서 테스트 진행 해야 한다.
spring.jpa.hibernate.ddl-auto=none
반응형