SpringBootTest로 서블릿 컨테이너 설정

  • 스프링 부트는 자동 설정의 일부만을 테스트 슬라이스로 가져와서 테스트에 활용할 수 있도록 다양한 테스트 어노테이션을 제공한다.
  • 대부분 health check를 확인 할수 있는 HTTP 종단점을 사용하기 위해서는 서블릿 컨테이너를 필요로 한다.
  • @SpringBootTest 어노테이션은 어플리케이션 컨텍스트를 전체를 사용하도록 설정된 통합 테스트를 할때 사용되어야한다.
  • @SpringBootTest로 테스트 컨텍스트에 맞는 서블릿 환경을 설정 할수 있다.(webEnvironment 속성을 통해 어플리케이션 임베디드 서블릿 컨테이너를 설정 할수 있다.)

@SpringBootTest의 webEnvironment 속성

  • MOCK - WebApplicationContext를 로딩 하고 모의 서블릿 환경을 제공
  • DEFINED_PORT - EmbeddedWebApplicationContext를 로딩, 지정된 포트 번호를 통해 실제 서브릿 환경 제공
  • RANDOM_PORT - EmbeddedWebApplicationContext를 로딩, random 포트 번호를 통해 실제 서브릿 환경 제공
  • NONE - 어플리케이션 컨텍스트를 로딩하지만 서블릿 환경을 제공하지 않는다,

슬라이스

스프링 부트는 어플리케이션 테스트 슬라이스를 위한 여러 가지 어노테이션을 제공한다.

@JsonTest

JsonTest를 사용하면 Json직렬/역질렬화 테스트가 가능하다.

user.json

1
2
3
4
5
6
7
8
9
{
"username": "user",
"firstName": "Jack",
"lastName": "Frost",
"email": "jfrost@example.com",
"createdAt": 12345,
"lastModified": 12346,
"id": 0
}

UserTests

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

@RunWith(SpringRunner.class)
@JsonTest
public class UserTests {

private User user;

//JackSon 에서 제공하는 AssetJ 기반의 Json테스터를 주입
@Autowired
private JacksonTester<User> json;

@Before
public void setUp() throws Exception {
User user = new User("user", "Jack", "Frost", "jfrost@example.com");
user.setId(0L);
user.setCreatedAt(12345L);
user.setLastModified(12346L);

this.user = user;
}

@Test
public void serializeJson() throws Exception {
//유저를 Json으로 변화하고 비교
assertThat(this.json.write(user)).isEqualTo("user.json");
assertThat(this.json.write(user)).isEqualToJson("user.json");
assertThat(this.json.write(user)).hasJsonPathStringValue("@.username");

//실제 Json결과가 예상한 속성값과 일치하는지 판정
assertJsonPropertyEquals("@.username", "user");
assertJsonPropertyEquals("@.firstName", "Jack");
assertJsonPropertyEquals("@.lastName", "Frost");
assertJsonPropertyEquals("@.email", "jfrost@example.com");
}

@Test
public void deserializeJson() throws Exception {
String content = "{\"username\": \"user\", \"firstName\": \"Jack\", "
+ "\"lastName\": \"Frost\", \"email\": \"jfrost@example.com\"}";

assertThat(this.json.parse(content)).isEqualTo(
new User("user", "Jack", "Frost", "jfrost@example.com"));
assertThat(this.json.parseObject(content).getUsername()).isEqualTo("user");
}

private void assertJsonPropertyEquals(String key, String value)
throws java.io.IOException {
assertThat(this.json.write(user)).extractingJsonPathStringValue(key)
.isEqualTo(value);
}
}

isEqualTo에 user.json의 파일 참조를 통한 테스트

WebMvcTest

스프링 MVC 컨트롤러의 테스트 지원한다

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

@RunWith(SpringRunner.class)
@WebMvcTest(AccountController.class)
public class AccountControllerTest {

//목 객체 주입
@Autowired
private MockMvc mvc;

//목 객체 생성
@MockBean
private AccountService accountService;

@Test
public void getUserAccountsShouldReturnAccounts() throws Exception {
String content = "[{\"username\": \"user\", \"accountNumber\": \"123456789\"}]";


given(this.accountService.getUserAccounts()).willReturn(
Collections.singletonList(new Account("user", "123456789")));

//Mock client를 활용하여 실제 컨트롤러가 반환하는 값과 테스트에서 예상한 값이 일치하는지 판정한다.
this.mvc.perform(get("/v1/accounts").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andExpect(content().json(content));
}
}

MockMvc는 스프링 MVC 테스트 프레임워크에서 제공되는 클래스이다. 클라이언트의 요청은 테스트 대상 컨트롤러로 전달되는 역할을 한다.

DataJpaTest

  • JPA테스트 지원 및 내장 인매모리 데이터베이스도 제공
  • TestEntityManager는 JPA엔티티 테스트에서 자주 사용되는 구문과 유틸성 메소드를 추가하여 만들어졌다.

<네이티브 클라우드 자바 4장 테스트 참고>