DB(데이터 접근 기술 테스트, 임베디드 모드 )

jhwan·2024년 12월 9일
  1. 각 테스트들은 기존 DB에 컬럼값들에 의해 테스트 결과가 오염받지 않아야 한다. 따라서 테스트 DB를 application.properties에 설정해주고, 각 테스트가 진행될 때 마다 데이터들이 DB에 저장되지 않도록 롤백해주어야 한다.
  • 1번 방법
@SpringBootTest
class ItemRepositoryTest {

    @Autowired
    PlatformTransactionManager transactionManager;
    TransactionStatus status;

    @BeforeEach
    void beforeEach(){
        //트랜잭션 시작
        status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    }

    @AfterEach
    void afterEach() {

        //트랜잭션 롤백
        transactionManager.rollback(status);
    }
}
  • 2번 방법
    Class위에 @Transactional 어노테이션을 붙이면 된다.
    Test에서는 @Transactional은 성공해도 데이터를 롤백한다.
  1. 테스트임에도 commit하고 싶을 때
  • 1번 방법
    @Transactional(false)
  • 2번 방법
    @Commit
  1. 임베디드 모드
    방법1 DB를 Java Application에 내장하여 실행된다.
    순서 (1)
@Slf4j
//@Import(MemoryConfig.class)
//@Import(JdbcTemplateV1Config.class)
//@Import(JdbcTemplateV2Config.class)
@Import(JdbcTemplateV3Config.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(ItemServiceApplication.class, args);
	}

	@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;
	}
}

순서 (2) test/resources/schema.sql 작성

방법 2
schema.sql을 설정하고 돌리면 자동으로 된다.

0개의 댓글