spring boot에서 spring data jpa에 대한 통합 테스트 자바 버전

2016-06-21 09:52

지난 번에 scala 버전으로 spring boot에서 spring data jpa에 대한 통합 테스트를 하는 경우 설정을 남기기는 했다. 이 번에 수업 준비하면서 자바 버전을 공유해 본다.

이 설정이 필요한 이유는 JPA에 대한 테스트만 진행하고 싶은 경우이다. spring boot를 사용하는 경우 @SpringBootApplication으로 설정 파일을 관리하다보니 Persistence Layer에 대한 테스트만 진행하고 싶은데 애플리케이션 전체가 로딩되는 불편함이 있기 때문이다.

먼저 다음과 같은 Spring 설정 파일을 하나 만든다.

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
import org.springframework.boot.orm.jpa.EntityScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableAutoConfiguration
@EntityScan("next.domain")
@EnableJpaRepositories("next.repository")
@EnableTransactionManagement
public class RepositoryConfiguration {
}

이 설정 파일을 각 테스트 파일에서 곧바로 사용할 수도 있지만 JPA 테스트를 담당하는 추상 클래스를 하나 만들면 좀 더 편하게 구현할 수 있겠다.

import javax.transaction.Transactional;

import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RepositoryConfiguration.class)
@Transactional
public abstract class IntegrationTest { 
}

위와 같이 기반 코드를 만들어 놓으면 이후에는 다음과 같이 쉽게 JPA 테스트를 진행할 수 있다.

public class CardRepositoryTest extends IntegrationTest {
    @Autowired
    private CardRepository cardRepository;

    @Test
    public void crud() throws Exception {
    }
}

JPA를 사용하는 경우 굳이 테스트를 해야 되냐고 의문을 가질 수 있다. 혹자에 따라서는 필요없을 수 있다고 생각한다. 하지만 나는 JPA에 대한 경험이 적은 경우에는 이와 같은 테스트 코드를 통해 매핑이 잘 되었는지, 자신이 기대하는 쿼리가 생성되는지에 대한 확인 작업을 반드시 해야 한다고 생각한다. JPA를 사용하는 경우 기대하지 않는 매핑 결과 또는 쿼리가 생성되는 경우가 있어 성능 저하의 원인이 될 수 있기 때문에 경험이 적은 경우에는 이 같은 테스트 코드를 통해 검증하는 과정을 거칠 것을 추천한다.

0개의 의견 from FB

3개의 의견 from SLiPP

2016-08-31 16:33

spring boot 1.3 버전에서 JpaRepository만 테스트하려고 애노테이션을 찾고, 이러 저리 다양한 삽질 끝에 위 방법을 찾았다. 그런데 spring 1.4 버전에서 다음과 같이 애노테이션 하나로 끝나버려 허무함이 밀려온다.

@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryTest {
    @Autowired
    private UserRepository userRepository;

    @Test
    public void crud() {
        User user = new User("userId", "password", "name", "javajigi@slipp.net");
        userRepository.save(user);
    }
}

SpringJunt4ClassRunner도 SpringRunner로 이름이 짧아졌고, 1.3 버전에서 무지막지한 설정을 해야했던 애노테이션 설정도 @DataJpaTest 하나로 끝이다. 허무하지만 그래도 이렇게 짧게 구현할 수 있으니 좋다. 위 본문 글은 잊어버리자.

2018-03-05 10:18

https://github.com/spring-projects/spring-boot/tree/v2.0.0.RELEASE/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa

@DataJpaTest 로 테스트 진행시 환경에 따라서 @AutoconfigureTestDatabase 설정이 되야 하는 듯 한데 말이죠. 기존 소스에 붙이려니 뭔가 더 작업을 해야 하네요.

boot test는 쭈~욱 아래 처럼 했는데..역시 직접 DB연동해서 하는 테스트는 애매..

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(value = "local")
public class XxxxRepositoryTest {
...
의견 추가하기