Diferencia entre revisiones de «Mock de un web service con Jetty»
De Dos Ideas.
Línea 112: | Línea 112: | ||
//Se programa la respuesta que entregará el web service frente a una | //Se programa la respuesta que entregará el web service frente a una | ||
//petición. | //petición. | ||
− | //La respuesta se pasa en forma de xml. | + | //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. | //Es posible también configurar diferentes respuestas del protocolo de HTTP. | ||
webServiceServerMock.crearOperacion(xmlRespuesta, HttpServletResponse.SC_OK); | webServiceServerMock.crearOperacion(xmlRespuesta, HttpServletResponse.SC_OK); |
Revisión actual del 18:51 27 oct 2009
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(); }
}