욱'S 노트

MockServer - Getting Started 본문

Programming/MockServer

MockServer - Getting Started

devsun 2016. 2. 18. 14:35

What is MockServer


목서버는 HTTP나 HTTPS를 경유하는 어떠한 시스템을 모킹하기위해서 사용할 수 있다.


목서버는 다음과 같은 일을 할 수 있다.:


어떠한 요청에 예상되는 목 응답을 리턴할 수 있다.

예상되는 요청이 왔을때 요청을 포워딩할 수 있다. (i.e. a dynamic port forwarding proxy)

요청이 예상한바와 맞을때 콜백을 호출할 수 있다. 요청은 다이내믹하게 생성할수도 있다.

요청이 제대로 전송되었는지를 검증할 수 있다. (i.e. as a test assertion)


Why use MockServer


목서버는 어떠한 서버나 서비스에 대한 목을 제공한다. 제공하는 프로토콜은 HTTP, HTTPS, REST, RPC이다.


다음과 같은 시나리오에 유용하게 이용할 수 있다.


testing

HTTP의 디펜던시를 가진 REST나 RPC 서비스의 모든 타입의 응답을 쉽게 생성할 수 있다.

독립된 시스템 내부 테스트를 수행할 수 있다. 시스템 내부테스트는 외부 네트워크 실패나 서버가 리부팅되고 있거나 하는 외부 요인과 상관없이 테스트를 수행할 수 있다.

각 테스트를 위한 독립적인 목 응답을 세팅할 수 있다. 테스트간 데이터를 공유하는 것은 피해라 이는 각 테스트를 관리하고 유지하는데 어려움을 유발할 수 잇다.

시스템내부 테스트에서 요청이 정상적으로 송신되었는지를 확인한다.


de-coupling development

서비스가 이용가능하기 전에 서비스를 사용하는 API를 개발할때 활용할 수 있다.

API개발팀과 API를 사용하는팀의 개발 사이클을 완전히 분리할 수 있다. 양쪽 스펙만 확정하였다면 API생성여부와 상관없이 결과를 리턴할 수 있다.


따라해보기


일단 목서버의 디펜던시를 추가하자. 현재 필자는 빌드환경으로 gradle을 사용하고 있다.

testCompile "org.mock-server:mockserver-netty:3.10.1"


디펜던시 추가가 완료되었으면 다음과 같은 간단한 테스트 코드를 작성하고 실행을 시켜보자.

public class MockServerTest {
public static void main(String[] args) {
ClientAndServer mockServer = ClientAndServer.startClientAndServer(10800);
}
}

15:20:35.505 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework

... 중략 ...

15:20:35.813 [MockServer Thread] INFO  org.mockserver.mockserver.MockServer - MockServer started on port: 10800


위와 같은 로그가 콘솔에 출력되고 10800으로 MockServer가 실행된 것을 알 수 있다.

String message = "{message : \"Hello World \"}";
mockServer
.when(HttpRequest.request().withMethod("GET").withPath("/test"))
.respond(HttpResponse.response().withStatusCode(200).withBody(message));


다음과 같은 코드를 추가해보자. 간략하게 설명하자면 /test 패스에 대한 GET 요청이 왔을때, 메시지에 해당하는 json을 리턴으로 주겠다는 의미이다. 요청을 쉽게 보내기 위해서 Spring의 RestTemplate을 사용하였다.

String response = new RestTemplate().getForObject("http://localhost:10800/test", String.class);
System.out.println("Response is " + response);


마지막으로 직접 로컬 구동된 목서버로 HTTP 요청을 보내보자. 콘솔에 아래와 같이 요청결과가 정확히 리턴되는 것을 알 수 있다.


Response is {message : "Hello World "}


Comments