JUnit5 시작하기


JUnit 테스트 코드를 작성해보자.

예전에 진행했던 SNS 프로젝트를 다시 Rest API로 구현하는 중에 JUnit5로 테스트 코드를 작성해보기로 했다. 아직 구현 기능이 많지 않고 이번 프로젝트에서 DB, 서버 배포 등을 구체적으로 결정하지 않았기 때문에 천천히 예제로 테스트 코드를 작성해보고 프로젝트에도 적용할 예정이다.




JUnit5 특징

JUnit4가 단일 jar 였던 것에 반해 JUnit5는 다음과 같은 모듈로 구성되어 있다.




Gradle 설정

dependencies {

    . . .

    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude module: 'junit'
    }
    testImplementation 'org.junit.jupiter:junit-jupiter-api'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}

test {
    useJUnitPlatform()
}


위 JUnit5의 특징에서 알아봤듯이 junit에 3, 4 버전이 포함되어 있기 때문에

junit5만 사용할 생각이라면 위 gradle 설정처럼 junit을 제외하면 된다.

그러나 junit5는 jupiter-api, jupiter-engine을 필요로하기 때문에 위와 같은 설정을 추가해야 한다.




Spring Boot에서는 어떻게?

스프링 부트 2.0에서 일반적인 스프링과 마찬가지로 @ExtendWith 어노테이션을 사용하지만 @ContextConfiguration 대신에 @SpringBootTest을 사용한다. @SpringBootTest 어노테이션은 애플리케이션 컨텍스트를 실행해준다.

@ExtendWith(SpringExtension.class)
@SpringBootTest
class SimpleSpringTest {

    @Autowired
    public MessageComponent messageComponent;

    @Test
    public void test() {
        assertEquals("Hello world!", messageComponent.getMessage());
    }

}




Spring Boot가 아니라면?

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { MySpringApplication.class })
class SimpleSpringTest {
    . . .
}




JUnit5와 Mockito 사용

Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜(Mock) 객체를 지원하는 테스트 프레임워크다.

Spring은 여러 객체들 간의 의존성이 존재해 단위 테스트 작성이 어려워질 수 있는데

이를 해결하기 위해 가짜 객체를 주입시키는 Mockito 라이브러리를 활용할 수 있다.



1) Mock 객체 의존성 주입

Mockito에서 Mock 객체의 의존성 주입을 위해 어노테이션을 사용한다.


예를들어 UserController에 대한 단위 테스트를 작성하고자 할 때, UserService를 사용하고 있다면

@Mock 어노테이션으로 가짜 UserService를 만들고,

@InjectMocks 어노테이션으로 UserController에 이를 주입시킬 수 있다.



2) Stub

의존성이 있는 객체는 가짜 객체를 주입하면 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 한다.


Mockito는 다음과 같은 stub 메서드를 제공한다.


예를들어 UserService의 findAllUser() 호출 시 빈 ArrayList를 반환해야 한다면 다음과 같이 작성하면 된다.

doReturn(new ArrayList()).when(userService).findAllUser();



3) Mockito와 JUnit의 결합

Mockito도 테스팅 프레임워크다. 그래서 JUnit과 결합하기 위해 별도의 작업이 필요하다.


기존의 JUnit4에서 Mockito를 사용하기 위해 클래스 어노테이션으로

@RunWith(MockitoJUnitRunner.class)를 불여야했다.


JUnit5부터는 @ExtendWith(MockitoExtention.class)를 사용해야 결합이 가능하다.




참고