test code snippet with QueryDSL and @DataJpaTest

dasd412·2022년 12월 14일
0

code-snippet

목록 보기
1/2

QueryDSL 주입용 테스트 클래스 코드

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

설명

  1. @Import({JPATestConfiguration.class})는 처음에 설명한 Querydsl 주입용 테스트 클래스를 임포트해준다.

  2. @DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD)는 각 테스트 실행시마다 실행 컨텍스트를 초기화해준다.
    예를 들어 테스트 1에서 저장을 했다고 하고 그 다음 테스트 2에서 저장을 또 했다고 하자.
    이 어노테이션이 부착 안되있으면 컨텍스트가 초기화되있지 않기 때문에 테스트 2 실행 당시 리포지토리 내 엔티티 개수는 2개다.
    반대로 부착이 되어 있다면 테스트 2 실행 당시 리포지토리 내 엔티티 개수는 1개다.

  3. @DataJpaTest()@RunWith(SpringRunner.class)는 반드시 함께 써야 한다.

    참고로 @RunWith(SpringRunner.class)는 테스트 실행 중, @Autowired, @MockBean 붙어 있는 것들을 주입시켜준다.

3.의 인용문 참고

https://4whomtbts.tistory.com/128

profile
아키텍쳐 설계와 테스트 코드에 관심이 많음.

0개의 댓글