import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@TestConfiguration
public class JPATestConfiguration {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
@SpringBootTest
를 사용하면 상관 없지만, JPA만 슬라이싱 테스트할 때는 Querydsl 코드가 문제가 된다.
이를 해결하기 위한 코드가 위 코드이다.
패키지 위치는 src/main이 아닌 src/test 에 위치시켜야 한다.
@RunWith(SpringRunner.class)
@Import({JPATestConfiguration.class})
@DataJpaTest()
@TestPropertySource(locations = "/application-test.properties")
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD)
public class SomethingTest {
@Autowired
private SomethingRepository repository;
@MockBean
private SomeBean bean;
...
}
@Import({JPATestConfiguration.class})
는 처음에 설명한 Querydsl 주입용 테스트 클래스를 임포트해준다.
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD)
는 각 테스트 실행시마다 실행 컨텍스트를 초기화해준다.
예를 들어 테스트 1에서 저장을 했다고 하고 그 다음 테스트 2에서 저장을 또 했다고 하자.
이 어노테이션이 부착 안되있으면 컨텍스트가 초기화되있지 않기 때문에 테스트 2 실행 당시 리포지토리 내 엔티티 개수는 2개다.
반대로 부착이 되어 있다면 테스트 2 실행 당시 리포지토리 내 엔티티 개수는 1개다.
@DataJpaTest()
와@RunWith(SpringRunner.class)
는 반드시 함께 써야 한다.
참고로 @RunWith(SpringRunner.class)
는 테스트 실행 중, @Autowired
, @MockBean
붙어 있는 것들을 주입시켜준다.