"테스트 주도 개발: 테스트가 개발을 이끌어 나간다."
라고 정의할 수 있다.
메소드 나 함수 같은 프로그램 모듈을 작성할 때
‘작성 종료조건을 먼저 정해놓고 코딩을 시작 한다’는 의미로 받아들이면 편하다.
RED
: 항상 실패하는 테스트를 먼저 작성GREEN
: 테스트에 통과하는 프로덕션 코드 작성REFACTOR
: 테스트가 통과하면 프로덕션 코드를 리팩토링위의 레드 그린 사이클 처럼 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고 해당 과정을 반복하면서
제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.
package com.swchoi.webservice.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Application 클래스는 앞으로 만들 프로젝트의 메인 클래스가 됩니다.
package com.swchoi.webservice.springboot.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
package com.swchoi.webservice.springboot.web;
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;
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.status;
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void hello가_리턴된다() throws Exception {
String hello = "hello";
mvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string(hello));
}
}
자바 개발자들의 필수 라이브러리 롬북(Lombok) 입니다.
build.gradle 파일에 추가 한다.
compile('org.projectlombok:lombok')
인텔리j lombok 플러그인 추가
롬북 설정 (Enalbe annotation processing 체크)
package com.swchoi.webservice.springboot.web.dto; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public class HelloResponseDto { private final String name; private final int amount; }
package com.swchoi.webservice.springboot.web.dto; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; public class HelloResponseDtoTest { @Test public void 롬북_기능_테스트() { //given String name = "test"; int amount = 1000; //when HelloResponseDto dto = new HelloResponseDto(name,amount); //then assertThat(dto.getName()).isEqualTo(name); assertThat(dto.getAmount()).isEqualTo(amount); } }
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name,
@RequestParam("amount") int amount) {
return new HelloResponseDto(name, amount);
}
@Test
public void helloDto가_리턴된다() throws Exception {
String name = "hello";
int amount = 1000;
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)));
}
안녕하세요 승원씨 블로그 통해서 많이배우고 있어서 항상 감사드립니다! 바쁘실테니 요점만 간단히 해서 질문하겠습니다. 저는 환경은 java8, Maven, Eclipse 를 쓰고있습니다.
.andExpect(MockMvcResultMatchers.status().isOk()) //Header의 Status 검증
.andExpect(MockMvcResultMatchers.jsonPath("$.name", ));
저는 perform안에 메소드를 쓸때 MockMvcRequestBuilders를 명시해주고 써야하는데 달라서 자바버전이 달라서 그런걸까요?
2. 다른것들은 그래도 대체했는데, jsonPath를 쓰는곳은 Matcher클래스를 써도 is메소드가 없어서 어떤걸로 대체하면될지 알고싶습니다.
바쁘시다면 굳이 답장안해주셔도 됩니다. 블로그보고 따라하면서 아직 초보개발자지만 덕분에 많이배우고 있습니다.
감사합니다.