static method 모킹하는 방법
MockedStatic<TestClass> mock = mockStatic(TestClass.class);
1. TestClass클래스 타입으로 Mocking 해준다.
mock.when(() -> TestClass.getMethod).thenReturn(null);
2. 모킹한 객체로 when 사용시 직접 static method를 호출
- 대신 의존성으로 mockito-inline 이 필요함.
WebMVCTest vs AutoconfigureWebMvc vs SpringBootTest 차이점
- SpringBootTest는 실제와 마찬가지로 어플리케이션을 시작하며 테스트를 한다.
- webEnvironment = WebEnvironment.RANDOM_PORT 사용시
- 임의의 포트를 사용한다.
- 임의의 포트를 사용하는 이유는 테스트할때 충돌을 방지하기 위함.
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class HttpRequestTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/",
String.class)).contains("Hello, World");
}
}
- AutoconfigureWebMvc는 서버를 시작하지 않고 아래 계층만 테스트
- Spring은 들어오는 HTTP 요청을 처리하고 이를 컨트롤러에 전달
- 아래와 같이 테스트를 한다면 전체 스택이 사용되며 코드는
- 실제 HTTP 요청을 처리하는 것과 똑같은 방식으로 호출되지만 서버시작 비용이 없다.
@SpringBootTest
@AutoConfigureMockMvc
public class TestingWebApplicationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, World")));
}
}
- WebMvcTest는 MVC쪽만 따로 테스트 할때 사용
- 테스트 범위를 웹레이어쪽으로 스코프를 지정한다는 의미
@WebMvcTest
public class WebLayerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, World")));
}
}