IT/Spring

[JUnit] 테스트 기본 - 2

infe91 2020. 2. 13. 23:23

오늘은 url 호출에서 parameter가 존재할 때 테스트를 어떻게 하는지 알아본다.

  1. 아래와 같이 name 과 age 파라미터를 통해 url을 Get으로 호출 하려고 할 때 코드와 테스트 코드를 어떻게 작성하는지 알아본다.

    http://localhost:8080/hello/dto?name=incheol&age=28 
  2. HelloResponseDto.java 을 생성한다.

package com.incheol.app.web.dto;
import lombok.Getter;  
import lombok.RequiredArgsConstructor;

@Getter  
@RequiredArgsConstructor  
public class HelloResponseDto {

private final String name;
private final int age;

}
  1. HelloResponseDtoTest.java 을 생성한다.

  테스트를 할땐 Given, When, Then 세 가지를 기억하면 된다.  
 Given : 시나리오 진행에 필요한 값을 설정한다.  
  When : 시나리오를 진행하는데 필요한 조건을 명시한다.  
  Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시한다.
package com.incheol.app.web.dto;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;

public class HelloResponseDtoTest {

    @Test
    public void lombokTest() {

        //Given : 시나리오 진행에 필요한 값을 설정한다.
        String name = "incheol";
        int age = 28;

        //When : 시나리오를 진행하는데 필요한 조건을 명시한다.
        HelloResponseDto dto = new HelloResponseDto(name, age);

        //Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시한다.
        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAge()).isEqualTo(age);

    }
}
  1. Junit 실행시켜서 테스트가 제대로 수행 되었는지 확인한다.

  1. HelloController.java 에 Get /hello/dto API을 추가한다.

package com.incheol.app.web;

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

import com.incheol.app.web.dto.HelloResponseDto;

import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("age") int age) {
        return new HelloResponseDto(name, age);
    }

}
  1. 4번에서 추가한 기능을 테스트 코드로 작성해서 테스트를 해본다.

package com.incheol.app.web;
import static org.hamcrest.CoreMatchers.is;  
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.jsonPath;  
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;  
import org.junit.runner.RunWith;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;  
import org.springframework.test.context.junit4.SpringRunner;  
import org.springframework.test.web.servlet.MockMvc;

@RunWith(SpringRunner.class)  
@WebMvcTest // Web(Spring MVC)에 집중할 수 있는 어노테이션  
public class HelloControllerTest {


  @Autowired
  private MockMvc mvc; //웹 API을 테스트 할때 사용하는 가짜 데이터 , GET, POST 등에 대한 테스트를 할 수 있음.


  @Test
  public void returnHello() throws Exception {
      String hello = "hello";

      //테스트를 하는 행위(perform) => 하나씩 기대 값을 넣고 테스트를 한다. 
      mvc.perform(get("/hello"))
      .andExpect(status().isOk())
      .andExpect(content().string(hello));
  }

  @Test
  public void returnHelloResponseDto() throws Exception {

      //Given : 시나리오 진행에 필요한 값을 설정한다.
      String name = "kabby";
      int age = 28;

      //When : 시나리오를 진행하는데 필요한 조건을 명시한다.
      //Then : 시나리오를 완료했을 때 보장해야 하는 결과를 명시한다.
      mvc.perform(get("/hello/dto")
              .param("name", name) // name => kabby
              .param("mount", String.valueOf(age))) // age => 28
              .andExpect(status().isOk()) // 파라미터 2개의 기대 값에 대하여 상태 값 200을 받는지 비교한다.
              .andExpect(jsonPath("$.name", is(name))) // {name: "kabby"} => jsonPath을 통해 값을 비교를 한다.
              .andExpect(jsonPath("$.mount", is(age))); // {age: 28}  => jsonPath을 통해 값을 비교를 한다.


      }


   }
  1. Junit 실행시켜서 테스트가 제대로 수행 되었는지 확인한다.

  1. 실제로 화면에서 {"name":"kabby","age":28} 이 나왔는지 확인한다.

오늘은 웹 API을 테스트 할 때 Get 기준 파라미터가 존재 할때 어떻게 테스트를 하는지 알아봤다.