2.테스트코드 작성하기

JUnit4 -> 5 변경점

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
junit4 -> 5

1. @Test
패키지 위치 변경

org.junit.Test
-> org.junit.jupiter.api.Test

2. @RunWith
Junit5에서 @ExtendWith 로 변경되서 어노테이션명과 패키지위치 변경

org.junit.runner.RunWith
-> org.junit.jupiter.api.extension.ExtendWith

@RunWith
-> @ExtendWith

3. SpringRunner
SpringExtension 으로 변경되서 클래스명과 패키지위치 변경

SpringRunner
-> SpringExtension

org.springframework.test.context.junit4.SpringRunner
-> org.springframework.test.context.junit.jupiter.SpringExtension

4. @After
테스트 메소드가 끝날때마다 수행되는 @After 도 Junit5에서 @AfterEach 로 변경되었기 때문에 어노테이션과 패키지위치 변경

@After
-> @AfterEach

org.junit.After
-> org.junit.jupiter.api.AfterEach

5. @Before
마찬가지로 @BeforeEach 로 변경되서 어노테이션과 패키지위치 변경

@Before
-> @BeforeEach

org.junit.Before
-> org.junit.jupiter.api.BeforeEach

샘플 컨트롤러 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.jojoldu.book.springboot.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

//컨트롤러를 JSON을 반환하는 컨트롤러로 만들어준다.
@RestController
public class HelloController {

//HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어 준다.
@GetMapping("/hello")
public String hello() {
return "hello";
}
}

샘플 단위 테스트 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.jojoldu.book.springboot.web;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

/*
1. @ExtendWith(SpringExtension.class)
- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
- 여기서는 SpringExtension 이라는 스프링 실행자를 사용한다.
- 스프링 부트 테스트와 JUnit 사이에 연결자 역할
- JUnit4 -> 5로 넘어오면서 사용하는 어노테이션과 클래스가 각각 @RunWith -> @ExtendWith 로 SpringRunner -> SpringExtension 으로 변경되었다.

2. @WebMvcTest
- 여러 스프링 테스트 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션
- 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다.
- 단, @Service, @Component, @Repository 등은 사용할 수 없다.
*/

@ExtendWith(SpringExtension.class)//1
@WebMvcTest(controllers = HelloController.class)//2
public class HelloControllerTest {

/*
3. AutoWired
- 스프링이 관리하는 빈(Bean)을 주입 받는다.

4. private MockMvc mvc
- 웹 API를 테스트할 때 사용한다.
- 스프링 MVC 테스트의 시작점
- 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있다.
*/
@Autowired//3
private MockMvc mvc;//4

@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";

/*
5. mvc.perform(get("/hello"))
- MockMvc를 통해 /hello 주소로 HTTP GET 요청을 한다.
- 체이닝이 지원되어 아래와 같이 여러 검증 기능을 이어서 선언할 수 있다.

6. .andExpect(status().isOk())
- mvc.perform의 결과를 검증한다.
- HTTP Header의 Status를 검증한다.
- 우리가 흔히 알고 있는 200, 404, 500 emddml 상태를 검증한다.
- 여기선 OK 즉, 200인지 아닌지를 검증한다.

7. .andExpect(content().string(hello))
- mvc.perform의 결과를 검증한다.
- 응답 본문의 내용을 검증한다.
- Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증한다.
*/
mvc.perform(get("/hello"))//5
.andExpect(status().isOk())//6
.andExpect(content().string(hello));//7
}
}

2.3 롬북(Lombok)

자바 개발 시 자주 사용하는 코드 Getteer, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해준다.

1
2
3
4
dependencies {
// lombok
implementation('org.projectlombok:lombok')
}
Author

Jaeyong Yoo

Posted on

2021-04-21

Updated on

2023-06-10

Licensed under

댓글