본문 바로가기
Spring

[Java/Spring] Junit 초기 설정 방법

by 오늘부터개발시작 2022. 7. 25.

Test Driven Development, 줄임말로 TDD가 사실상 필수적인 개발 방법이 된 시대가 되었다. 오늘은 Java 스프링에서 내가 사용하고 있는 간단한 Junit 세팅하는 방법에 대해서 공유해 보려고 한다. Junit도 사용하는 사람들에 따라서 꽤 다양한 세팅들을 구글링을 해보면 찾아볼 수 있다. 나는 Udemy에서 Spring TDD라는 강의를 듣고 그 강의에서 사용했던 방식을 그대로 적용해서 사용하고 있다.

 

Junit으로 TDD를 하기 위해서는 데이터베이스도 있어야하고 간단한 yaml 설정, 그리고 실제 테스트 클래스의 설정이 필요한데 이에 대해서 복잡하기 않게 내가 사용하는 방법을 공유해보도록하겠다.

 

데이터베이스

먼저 데이터베이스는 h2를 쓰고 있다. 단위테스트이기 때문에 데이터베이스가 어플리케이션이 구동될 때 생기고 끝나면 지워지는 in-memory 방식이 유용한 것 같다. 데이터베이스 초기화를 따로 하지 않아도 되기 때문이다. 안좋은 점은 선행 과정이 필요한 테스트를 할 때는 회원가입을 시키고, A 데이터를 만들고 B 데이터를 만들어서 C 데이터가 맞는지 확인하는 과정을 모두 수행해야하기 때문에 테스트 코드가 길어질 수도 있다는 점이다. 

 

Maven 프로젝트를 기준으로 h2 설정을 해보면 먼저 pom.xml에 h2-db dependency를 넣어준다.

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

 

그리고 yaml 파일에 profile이 test일 때 설정을 해준다.

 

spring:
  config:
    activate:
      on-profile: test
  h2:
    console:
      enabled: true
      path: /h2-console
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:

 

이렇게 설정을 해주고 어플리케이션을 동작 시킨 후에 http://localhost:8080/h2-console에 접속해보면 h2-db에 접속된 것을 확인할 수 있다.

*반드시 profile을 test로 설정한 상태에서 어플리케이션을 동작시켜야된다.

 

이렇게 설정해주면 테스트를 실행할 때마다 in-memory 데이터베이스를 사용할 수 있는 준비가 되었다. 

* mysql-connector, jpa 같은 디펜던시는 이미 연결되었으리라 가정 

 

테스트 클래스

 

다음으로는 실제 테스트 코드를 작성하는 클래스 설정이다. 먼저 몇가지 어노테이션들을 클래스 상단에 붙여줘야한다. 

첫번째 @ExtendWith(SpringExtension.class)는 스프링 컨텍스트를 사용하겠다는 의미인데, 사실 정확히는 모르지만, IoC같은 기능을 사용하기 위해서 필요한 것이 아닌가 싶다. 레포지토리나 서비스를 주입시켜주는 것은 스프링이 하기 때문이다.

 

두번째는 테스트할 때 사용할 웹서버 포트를 지정해주는 건데 위와 같이 RandomPort로 지정하게 되면 테스트를 시작하면 랜덤으로 포트하나가 설정되게 된다.

 

마지막으로 프로필 설정인데 우리는 test 프로필을 사용해서 db도 사용할 것이기 때문에 test로 설정해준다.

 

이후에는 실제 테스트 코드들을 작성하면 되는데 예시를 하나 써보겠다. 간단하게 유저를 생성했을 때 201코드를 응답받는 코드이다.

 

@Autowired
TestRestTemplate testRestTemplate;

@Test
public void postClientUser_withValidUserDto_receive201() {
    UserDto.Create dto = TestUtil.createValidClientUser(TEST_USERNAME);

    ResponseEntity<Object> response = signUp(dto, Object.class);

    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
}


public <T> ResponseEntity<T> signUp(UserDto.Create dto, Class<T> responseType) {
    return testRestTemplate.postForEntity(API_V_1_USERS, dto, responseType);
}

 

테스트로 api를 쏠 때는 TestRestTemplate을 사용할 수 있고 간단하게 결과를 받아서 HttpStatus 코드를 확인하는 코드이다.

 

이 외에도 테스트코드를 작성하다보면 새로이 알게되는 부분들이 많은데 오늘은 간단하게 설정을 하는 방법만 작성해보았다.

 

이상!