테스트코드는 단위테스트를 할 수 있게 해준다.
단위테스트 장점
-텍스트개발단계 초기에 문제를 발견하게 해준다.
-개발자가 코드를 리팩토링하거나 라이브러리 업그레이드에서 기존기능이 올바르 게 작동하는지 확인할 수 있다.
-시스템에 대한 실제 문서를 제공할수있다.
테스트코드를 작성하지 않는다면 프로그램을 실행시켜서 postman과 같은 api테스트 도구, 혹은 실제 결과를 눈은으로 확인, 프로그램 중지 와 같은 과정을 거쳐야하는데
이는 테스트코드를 작성하는 것에 비해
-프로그램의 기능의 확실성을 알 수 없다.
-시간이 오래걸린다.
-실제 문서를 제공하기 때문에 연쇄되는 오류를 조기에 찾을 수 있다.
1. Could not autowire. No beans of 'MockMvc' type found.
mockmvc를 빈주입이 불가능하다라는 오류
시도 방법1:
mockmvc를 제어하는 어노테이션인
@AutoConfigureMockMvc를 추가했다.
결과 : 실패
시도 방법2:
@WebMvcTest(controllers = HelloController.class)를
@AutoConfigureMockMvc와 결합된 @SpringBootTest를 변경
결과 : 실패
2. Cannot resolve symbol 'Runwith'
@Runwith(SpringRunner.class) 어노테이션을 찾을수 없다는 오류
Runwith는 junit4에서 사용되던 어노테이션으로
현재 스프링부트버전에서는 junit5가 기본으로 설정되어 있다.
junit5에서는 @ExtendWith(SpringExtension.class)로 바꿔서 사용한다.
결과 : 성공
package com.example.springbootwebservice.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.*;
import static org.hamcrest.Matchers.is;
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = HelloController.class)
class HelloCotrollerTest {
@Autowired
private MockMvc mvc;
@Test
public void helloreturn() throws Exception{
String name="hello";
int amount=1000;
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(name));
mvc.perform(get("/hello/dto")
.param("name",name)
.param("amount",String.valueOf(amount)))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name",is(name)))
.andExpect(jsonPath("$.amount",is(amount)));
}
}
@WebMvcTest(controllers = HelloController.class)
@Controller,@RestController인 컨트롤러(hellocontroller)를 메모리에 생성한다.
@ExtendWith(SpringExtension.class)
junit과 스프링부트테스트와의 연결자역할을 한다.
즉 테스트코드만 실행시 스프링부트의 실행도 같이 되게끔 해준다.(연결)
@Autowired
private MockMvc mvc
테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것을 모킹(Mocking)이라고 하고
MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.
즉 실제 구현한 어플리케이션 클래스를 구동하지않고 기능을 시뮬레이션하게 도와주는 역할을 한다.
mvc.perform(get("/hello"))
/hello 의 주소로 get요청을 한다.
체이닝이 지원되어서 검증기능을 이어서 선언할 수 있다.
.andExpect(status().isOk())
.andExpect(jsonPath("$.name).is(name)))
perform에 이어서 선언하며 검증해준다.
status().isOk() : 결과 상태 검증
jsonPath("$.name).is(name))) : name의 값 검증
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
@Test
public void testdto(){
String name= "test";
int amount=1000;
HelloResponseDto helloResponseDto = new HelloResponseDto(name,amount);
assertThat(helloResponseDto.getName()).isEqualTo(name);
assertThat(helloResponseDto.getAmount()).isEqualTo(amount);
}
}
1. 메서드에 @test어노테이션
2. 검증에 필요한 변수 선언
String name= "test";
int amount=1000;
3. dto 생성
HelloResponseDto helloResponseDto = new HelloResponseDto(name,amount);
4. 생성한 dto의 필드와 변수가 일치하는지 확인 assertThat(helloResponseDto.getName()).isEqualTo(name);
assertThat(helloResponseDto.getAmount()).isEqualTo(amount);