시작은 일단 spring-boot-starter-test를 추가하는 것 부터
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
@SpringBootTest@RunWith(SpringRunner.class)
랑 같이 써야 함. 빈 설정 파일은 설정을 안해주나? 알아서 찾음. (@SpringBootApplication)
MOCK
: mock servlet environment. 내장 톰캣 구동 안 함.MOCK MVC
를 이용해야함RANDON_PORT
, DEFINED_PORT
: 내장 톰캣 사용 함.NONE
: 서블릿 환경 제공 안 함.ApplicationContext
에 들어있는 빈을 Mock
으로 만든 객체로 교체 함.@Test
마다 자동으로 리셋. @RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class SamplecontrollerTest {
//서버를 구동하지 않고 mockMvc를 사용하여 테스트
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("hello ilhyun"))
.andDo(print());
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class SamplecontrollerTest {
@Autowired
TestRestTemplate testRestTemplate;
//서비스는 목으로 대체하여 controller만 테스트
@MockBean
SampleService mockSampleService;
@Test
public void hello() {
//controller만 테스트 하고싶다!! 서비스는 목으로 대체!! 이제 서비스는 shinilhyun을 리턴!
when(mockSampleService.getName()).thenReturn("shinilhyun");
String result = testRestTemplate.getForObject("/hello", String.class);
assertThat(result).isEqualTo("hello shinilhyun");
}
}
RestTamplate
에 비해 쓰기 편함 (추천)<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class SamplecontrollerTest {
//webTestClient 사용
// async 이므로 기다리지 않아도 됨 (RestTamplate = sync)
@Autowired
WebTestClient webTestClient;
@MockBean
SampleService mockSampleService;
@Test
public void hello() {
when(mockSampleService.getName()).thenReturn("shinilhyun");
webTestClient.get().uri("/hello").exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("hello shinilhyun");
}
}
로그를 비롯해서 콘솔에 찍이는 모든 것 (기록)검사 가능
@RunWith(SpringRunner.class)
@WebMvcTest(Samplecontroller.class)
public class SamplecontrollerTest {
@Rule
public OutputCapture outputCapture = new OutputCapture();
@MockBean
SampleService mockSampleService;
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
when(mockSampleService.getName()).thenReturn("shinilhyun");
mockMvc.perform(get("/hello"))
.andExpect(content().string("hello shinilhyun"));
assertThat(outputCapture.toString())
.contains("shinilhyun")
.contains("skip");
}
}