메인 리소스에 DB 연동 설정을 한 것처럼 테스트 코드에도 DB연결 설정을 해줘야 한다.
spring.profiles.active=test
spring.datasource.url=jdbc:h2:tcp://localhost/~/**test**
spring.datasource.username=sa
@SpringBootTest
class ItemRepositoryTest {
spring.profiles.active=test
spring.datasource.url=jdbc:h2:tcp://localhost/~/**testcase**
spring.datasource.username=sa
- 테스트 코드는 다른 테스트 코드 실행에 영향을 미쳐서는 안된다
- 테스트 코드는 반복해서 실행할 수 있어야 한다.
@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
@BeforeEach
void beforeEach() {
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
@AfterEach
void afterEach() {
//MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
// 트랜잭션 롤백
transactionManager.rollback(status);
}
트랜잭션 매니저의 생성과 커밋, 롤백 등의 반복되는 코드를 대체해주는 어노테이션이다.
@Transactional
@SpringBootTest
class ItemRepositoryTest {
@Autowired
ItemRepository itemRepository;
@AfterEach
void afterEach() {
//MemoryItemRepository 의 경우 제한적으로 사용
if (itemRepository instanceof MemoryItemRepository) {
((MemoryItemRepository) itemRepository).clearStore();
}
}
//임베디드 DB
@Bean
@Profile("test")
public DataSource dataSource() {
log.info("메모리 데이터베이스 초기화");
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
spring.profiles.active=test
drop table if exists item CASCADE;
create table item
(
id bigint generated by default as identity,
item_name varchar(10),
price integer,
quantity integer,
primary key (id)
);
이렇게 파일을 생성하고 테스트를 다시 시도해보면 아래처럼 테스트가 성공한 것을 확인할 수 있다.
spring.profiles.active=test
#spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase
#spring.datasource.username=sa
-위의 코드처럼 db설정 데이터를 주석 처리하면 스프링 부트에서 임베디드 db를 생성할 수 있는 db를 찾아서 자동으로 초기화해준다.
이것으로 DB를 연동하여 테스트를 하는 방법을 확인해보았다.
실제 DB와 연결해서 확인하는법, 임베디드 모드로 확인하는법, 테스트 격리 등