Mock de un web service con Jetty

De Dos Ideas.
Saltar a: navegación, buscar

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.
       //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