본문 바로가기
Spring Boot

[Spring Boot] 주로 사용되는 Junit Test

by 코리늬 2019. 12. 27.

본 내용은 백기선님의 스프링 부트 개념과 활용 영상을 보고 정리한 내용입니다.

spring-boot-starter-test 의존성 추가

webEnvironment 옵션

  • Mock : mock servlet environment. 내장 톰캣 구동 x
  • RANDOM_PORT, DEFINED_PORT : 내장 톰캣 사용
  • NONE : 서블릿 환경 제공 X
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc //MockMvc 를 주입받는 다양한 방법 중 하나
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;

    @Test
    public void 헬로() throws Exception{
        mockMvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string("seokhun hello"))
                .andDo(print());
    }
}

RestTemplate 테스트 하는 방법

  • TestRestTemplate
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

@Autowired
TestRestTemplate testRestTemplate;

@Test
    public void restTemplateTest(){
        String result = testRestTemplate.getForObject("/hello",String.class);
        assertThat(result).isEqualTo("seokhun hello");
    }

RestTemplate을 테스트 할 수 있는 TestRestTemplate을 주입받는다.

또한 WebEnvironment 옵션을 Random_port로 설정해주면 된다.

하지만 위의 2가지 테스트는 테스트 범위가 너무 크다.

Controller를 테스트 하기 위해 Service까지 가져다 사용하고 있다.

이를 분리해보자.

@MockBean

  • ApplicationContext에 들어있는 빈을 Mock으로 만든 객체로 교체
  • 모든 @Test 마다 자동으로 리셋.
    //이렇게 하면 여기서 만든 MockBean으로 서비스를 교체해준다.
    @MockBean
    SampleService mockSampleService;

    @Test
    public void mockingController(){
        when(mockSampleService.getHello()).thenReturn("Inflearn");

        String result = testRestTemplate.getForObject("/hello",String.class);
        assertThat(result).isEqualTo("seokhun Inflearn");
    }

@WebTestClient

  • Async하게 동작하기 때문에, WebClient와 비슷한 api 콜백을 받을 수 있다.

의존성 추가

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    //Async 하게 동작
    @Autowired
    WebTestClient webTestClient;

    //웹 클라이언트 사용
    @Test
    public void webTestClient(){
        when(mockSampleService.getHello()).thenReturn("InflearnClient");

        webTestClient.get().uri("/hello").exchange()
                .expectStatus().isOk()
                .expectBody(String.class).isEqualTo("seokhun InflearnClient");
    }

그 밖에 SpringBootTest를 사용하지 않고 각각의 레이어 별로 테스트하고 싶다면

  • @JsonTest
  • @WebMvcTest
  • @WebFluxTest
  • @DataJpaTest

등등이 있다.

 

테스트 유틸

  • OutputCapture

output으로 출력되는 모든것들이 캡쳐가 된다.

특이하게 public 으로 명시해줘야한다.

    //OutputCapture
    @Rule
    public OutputCapture outputCapture = new OutputCapture();

    @Test
    public void outPutCapture() throws Exception {
        when(mockSampleService.getHello()).thenReturn("Inflearn");

        mockMvc.perform(get("/hello"))
                .andExpect(content().string("seokhun Inflearn"));

        assertThat(outputCapture.toString())
                .contains("output")
                .contains("capture");
    }

 

댓글