JPA Test code 작성 중 아래와 같은 에러가 터졌다.
Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.
에러로그를 찬찬히 읽어보니.. AutoConfigureTestDatabase 옵션을 바꾸라고 얘기해준다..
ANY 옵션은 임베디드 DB(H2.. 같은) 가 있어야 대체된다고 하드라.. 그동안 습관적으로 H2를 깔고 시작했기 때문에 이 간단한 옵션 조차 잊어먹고 있었다.
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
NONE으로 바꿔서 실제 지금 연동중인 DB환경에서 테스트해보기로 했다. 그러니 위의 제목과 같은 에러가 떴다.
찾아보니, @DataJpaTest를 사용하면 별도의 스프링 빈을 등록하지 않고, 엔티티들과 EntityManager 정도만 등록해서 테스트하게 된다고 하드라. 별도로 빈을 주입시켜야 될 필요가 생겼다. 그래서 testConfig를 하나 만들었다.
@TestConfiguration
public class TestConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory(){
return new JPAQueryFactory(entityManager);
}
@Bean
public QuerydslOrderRepositoryImpl querydslOrderRepository(){
return new QuerydslOrderRepositoryImpl(jpaQueryFactory(), entityManager);
}
}
테스트 할려는 클래스에 import
@Transactional
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@DataJpaTest // Repository들을 다 IOC 등록해둠.
@Import(TestConfig.class)
class ItemRepositoryUnitTest {
@Autowired
private ItemRepository itemRepository;
@Test
public void saveTest() {
//BDDMocikto 방식
//given
Item item = new Food();
item.setName("test1");
//when
Item save = itemRepository.save(item);
//then
Assertions.assertThat(save.getName()).isEqualTo("test1"); //왼쪽인자가 내가 기대하는 값, 오른쪽인자가 실제 값 = 둘이 동일하면 true 리턴(테스트 성공!)
}
}
https://www.inflearn.com/questions/23063
https://velog.io/@ewan/Test-Case-%EC%97%90%EC%84%9C-JPAQueryFactory-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D