이번에는 단위테스트에서 Database에 접근하는 클래스를 테스트하는 방법을 보자.
우선 테스트를 알아보기전에 테스트할 코드를 만들어보자.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
우선 내장 데이터베이스를 이용하기 위해 h2와 데이터베이스 프로그래밍을 위해 jpa를 가져오자.
CREATE TABLE user (
id VARCHAR(45) NOT NULL,
password VARCHAR(45) NULL,
name VARCHAR(45) NULL,
PRIMARY KEY (id));
그다음은 간단하게 테이블을 하나 추가한다.
import javax.persistence.Entity;
import javax.persistence.Id;
@Getter
@Setter
@Entity(name = "User")
public class User {
@Id
private String id;
private String password;
private String name;
}
만든 테이블에 맞춰 jpa 저장소를 생성한다.
public interface UserRepository extends JpaRepository<User,String> {
User getUserById(String id);
}
마지막으로 위처럼 jpa repository를 만들어주자.
이제 테스트 코드를 만들어보자.
우선 Data Jpa테스트에서 사용할 3가지 어노테이션을 봐야한다.
1. @DataJpaTest
이 어노테이션은 앱내의 @Entity가 붙은 Jpa저장소만을 가져온다. 추가적으로 @Transactional 어노테이션이 내장되어있기 때문에 따로 명시할 필요가 없다.
2. @Transactional(propagation = Propagation.NOT_SUPPORTED)
Transactional기능이 필요없다면 위처럼 붙이면 된다.
3. @AutoConfigureTestDatabase.Replace.NONE)
내장 데이터베이스가 아닌 실제 데이터베이스에 테스트를 원할 경우 붙이면된다.
@DataJpaTest
class JpaTest {
@Autowired
UserRepository userRepository;
@Test
void saveTest(){
User user=new User();
user.setId("test");
user.setPassword("123");
user.setName("testName");
then(userRepository.save(user)).isNotNull();
then(userRepository.getUserById(user.getId()).getId()).isEqualTo(user.getId());
}
}
테스트는 위와 같이 진행하면 된다. 필요한 어노테이션을 붙이고, 테스트할 Repository를 가져와서 실행한다.
'Spring' 카테고리의 다른 글
@WebMvcTest (0) | 2021.07.01 |
---|---|
Spring Lifecycle Callback (0) | 2021.03.20 |
Spring 단위테스트 - 1 (0) | 2021.02.28 |
InMemory-H2 (0) | 2021.02.23 |
스프링 HttpMessageConverters (0) | 2021.01.27 |