/hello url로 요청을 받고 "hello"를 리턴하는 단순한 컨트롤러를 테스트 해보자!
@RestController
public class SampleController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
파라미터를 받는 테스트 코드
@ExtendWith(SpringExtension.class)
@WebMvcTest
class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
this.mockMvc.perform(get("/hello/junwoo"))
.andDo(print())
.andExpect(content().string("hello junwoo"));
}
}
당연히 테스트의 결과는 실패한다.
urlPath로 name 파라미터를 받아보자
@RestController
public class SampleController {
@GetMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return "hello "+name;
}
}
Formatter
-
Printer: 해당 객체를 (Locale 정보를 참고하여) 문자열로 어떻게 출력할 것인가
지금은 파라미터를 문자열로 받았지만 객체로 받을 수 있도록 변경해보자
@RestController
public class SampleController {
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name") Person person) {
return "hello "+person.getName();
}
}
테스트 결과 실패가 떨어진점을 확인할 수 있다.
왜일까?
현재 name 값을 객체 타입으로 변환 시킬 수 없기 때문이다.
Formatter 인터페이스를 구현하는 PersonFormatter 생성
public class PersonFormatter implements Formatter<Person> {
@Override
public Person parse(String s, Locale locale) throws ParseException {
Person person = new Person();
person.setName(s);
return person;
}
@Override
public String print(Person object, Locale locale) {
return null;
}
}
객체를 생성하여 세터에 해당 문자열을 넣어주어 파싱한다.
Foramtter 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new PersonFormatter());
}
}
스프링 부트에서는 이러한 설정이 어떻게 사용될까?
Bean으로만 등록되있으면 된다.
실행은 정상적으로 되지만 테스트는 깨진다.
왜일까?
@WebMvcTest 때문이다.
@WebMvcTest는 Slicing Test용이기 때문에 Web과 관련되어있는 Bean들만 등록된다.
지금은 그냥 일반 Bean으로 등록하였기 때문이다.
@ExtendWith(SpringExtension.class)
//@WebMvcTest
@SpringBootTest
@AutoConfigureMockMvc
class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
this.mockMvc.perform(get("/hello/junwoo")
.param("name","junwoo"))
.andDo(print())
.andExpect(content().string("hello junwoo"));
}
}
코드 참조
https://github.com/mike6321/Spring/tree/master/SpringMVC/demo-boot-web