Api를 호출하는 서비스에 대한 테스트는 잘 하지 않는 경우가 많다.
혹은 @Ignore
를 붙여놓고 필요시에만 풀어서 쓰는 경우도 있다.
Mock Server를 제공해서 테스트 할 수 있는 걸 알고 있는데, 자주 쓰지 않으니 쓸 때마다 헷갈려서 기록해둔다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
class FooApiServiceTest extends SpringRunnerSupport { private static final String API_URL = "http://www.freeism.co.kr/api/v1/test"; private static final String ID = "FREEISM"; @Autowired private FooApiService dut; @Autowired private RestTemplate restTemplate; private MockRestServiceServer server; @BeforeEach void before() { server = MockRestServiceServer.createServer(restTemplate); } @Test void whenSuccess() throws Exception { givenSucessApiResponse(); FooResponse result = dut.request(ID); assertThat(result.get(), is("SUCCESS")); assertThat(result.getId(), is(ID)); } @Test void whenFailure() throws Exception { givenFailureApiResponse(); FooResponse result = dut.request(ID); assertThat(result.getStatus(), not("SUCCESS")); } @Test void whenError() throws Exception { givenErrorApiResponse(); FooResponse result = dut.request(CID); assertThat(result, is(FooResponse.emptyObject())); } private void givenSucessApiResponse() throws Exception { givenApiResponse(HttpStatus.OK, asJson(mockSuccessResponse())); } private void givenFailureApiResponse() throws Exception { givenApiResponse(HttpStatus.OK, asJson(mockFailureResponse())); } private void givenErrorApiResponse() throws Exception { givenApiResponse(HttpStatus.INTERNAL_SERVER_ERROR, Strings.EMPTY); } private void givenApiResponse(HttpStatus httpStatus, String responseBody) throws Exception { server.expect(requestTo(API_URL)) .andExpect(method(HttpMethod.POST)) .andExpect(content().json(asJson(mockFooRequest()))) .andRespond(withStatus(httpStatus).contentType(MediaType.APPLICATION_JSON).body(responseBody)); } private FooRequest mockFooRequest() { return FooRequest.newInstance(ID); } private FooResponse mockSuccessResponse() { return mockFooResponse("SUCCESS"); } private FooResponse mockFailureResponse() { return mockFooResponse("ERROR"); } private FooResponse mockFooResponse(String status) { FooResponse response = new FooResponse(); response.setStatus(status); response.setId(ID); return response; } private String asJson(Object obj) throws JsonProcessingException { return new ObjectMapper().writeValueAsString(obj); } } |