[junit] Spring-Test 사용하기

2020. 9. 7. 12:59 테스트 코드/JUnit

Repository Test

스프링 테스트하기 위해 @RunWith로 SpringJUnit4ClassRunner를 사용해 spring-test를 확장한다.

@SpringApplicationConfiguration은 스프링을 사용하기 위해 설정한 설정 클래스를 지정하는 것인데, github에 소스를 보면 알겠지만 spring-boot를 사용했기 때문에 class(javaConfig)를 설정한 것이다. xml로 설정해도 마찬가지로 @SpringApplicationConfiguration을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {SpringJunitApplication.class, TestConfig.class})
@WebAppConfiguration
public class UserRepositoryTest {
 
    @Autowired private UserRepository userRepository;
    private User user;
 
    @Before
    public void setUp() throws Exception {
        user = new User();
        user.setUsername("woniper");
    }
 
    @Test
    public void testCreateUser() throws Exception {
        User createUser = userRepository.save(user);
        Assert.assertEquals(createUser.getUsername(), user.getUsername());
    }
}


Controller Test

웹 애플리케이션 테스트 코드를 작성하기는 조금 까다로운데, 그 이유는 웹 환경을 그대로 재현하기 힘들기 때문이다. 하지만 스프링에서는 웹 애플리케이션도 테스트 하기 쉽게 만들었다.

@Before 메소드를 보면 알겠지만 MVC를 테스트 하기 위해 MockMvcBuilders를 사용해 mock 객체를 생성한다.

설명하는 예제는 Restful api를 테스트 하는 것인데, 요청과 응답 데이터가 모두 json이기 때문에 json 데이터를 테스트하기 위해서 json-path 라는 라이브러리를 사용했다. 설명 예제는 github를 참고!!

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
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {SpringJunitApplication.class, TestConfig.class})
@WebAppConfiguration
@IntegrationTest("server.port=8888")
public class UserControllerTest {
 
    private User user;
 
    @Autowired private UserRepository userRepository;
    @Autowired private WebApplicationContext wac;
    @Autowired private ObjectMapper objectMapper;
    private MockMvc mock;
 
    @Before
    public void setUp() throws Exception {
        this.mock = MockMvcBuilders.webAppContextSetup(wac).build();
        user = new User();
        user.setUsername("woniper");
    }
 
    @Test
    public void testCreateUser() throws Exception {
        ResultActions resultActions =
                mock.perform(MockMvcRequestBuilders.post("/users")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsBytes(user)));
 
        resultActions.andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isCreated())
                .andExpect(MockMvcResultMatchers.jsonPath("$.username", Matchers.is(user.getUsername())));
    }
 
    @Test
    public void testGetUserList() throws Exception {
        User createUser = userRepository.save(user);
 
        ResultActions resultActions =
                mock.perform(MockMvcRequestBuilders.get("/users"));
 
        resultActions.andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$[0].userId", Matchers.is(createUser.getUserId())))
                .andExpect(MockMvcResultMatchers.jsonPath("$[0].username", Matchers.is(createUser.getUsername())));
    }
}

출처 : https://blog.woniper.net/272?category=531455