Mock de un web service con Jetty

De Dos Ideas.

El siguiente ejemplo de código muestra como crear una clase utilitaria que se encarga de simular un Web Service usando Jetty para atender las peticiones.

package com.dosideas.test;
 
import java.io.BufferedReader;
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.AbstractHandler;
 
import com.thoughtworks.xstream.XStream;
 
public class WebServiceServerMock {
 
private Server server;
 
private Envelope envelope;
 
private WebServiceServerMock() {
}
 
public static WebServiceServerMock crear(int port) throws Exception {
WebServiceServerMock mock = new WebServiceServerMock();
mock.server = new Server(port);
mock.server.start();
return mock;
}
 
public Envelope getRequestEnvelope() {
return envelope;
}
 
public void crearOperacion(final String xmlRespuesta, final int httpStatus) {
Handler handler = new AbstractHandler() {
public void handle(
String target,
HttpServletRequest request,
HttpServletResponse response,
int dispatch
) throws IOException, ServletException {
 
BufferedReader in = new BufferedReader(request.getReader());
String line = "";
String xml = "";
while (null != (line = in.readLine())) {
xml += line;
}
 
envelope = envelopeFromXml(xml);
 
response.setStatus(httpStatus);
response.getWriter().print(xmlRespuesta);
((Request) request).setHandled(true);
}
};
server.setHandler(handler);
}
 
public static Envelope envelopeFromXml(String xml) {
XStream xStream = new XStream();
xStream.alias("soapenv:Envelope", Envelope.class);
 
xStream.alias("soapenv:Body", Body.class);
xStream.aliasField("soapenv:Body", Envelope.class, "body");
 
//el resto de los mapeos
 
Envelope envelope = (Envelope) xStream.fromXML(xml);
return envelope;
}
 
public static class Body {
public ConsultarListasDisponiblesRequest consultarListasDisponiblesRequest;
}
 
public static class Envelope {
public Body body;
}
 
public void stop() throws Exception {
server.stop();
}
 
}

El test con JUnit

El siguiente test utiliza la clase anterior para maquetar el Web Service.

public class UnTest extends TestCase {
 
//Referencia al mock del web serivce
private WebServiceServerMock webServiceServerMock;
 
public void setUp() throws Throwable {
//Crea un WebServiceServerMock que escuchará peticiones en el
//puerto 7777
webServiceServerMock = WebServiceServerMock.crear(7777);
}
 
 
public void test() {
//Se programa la respuesta que entregará el web service frente a una
//petición.
//La respuesta se pasa en forma de xml según el WSDL deifinido simulando
//una respuesta real según lo que se necesite testear.
//Es posible también configurar diferentes respuestas del protocolo de HTTP.
webServiceServerMock.crearOperacion(xmlRespuesta, HttpServletResponse.SC_OK);
 
//Se ejercita la instancia que realizará la petición al server
instance.blah();
 
//Luego es posible pedirle al mock el request con el que se invocó
//el servicio, sobre el que se podrá realizar verificaciones.
Envelope envelope = webServiceServerMock.getRequestEnvelope();
 
}
 
 
public void tearDown() throws Exception {
//Una vez terminado el test, se detiene el servicio
webServiceServerMock.stop();
}
 
}

Ver también