Diferencia entre revisiones de «Mock de un web service con Jetty»

De Dos Ideas.
Saltar a: navegación, buscar
Línea 92: Línea 92:
 
</code>  
 
</code>  
  
== El test con JUnit ==
+
== El test con JUnit ==
  
El siguiente test utiliza la clase anterior para maquetar el [[Web Service]].
+
El siguiente test utiliza la clase anterior para maquetar el [[Web Service]].  
  
 
<code java="java">
 
<code java="java">
blah
+
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();
 +
    }
 +
 
 +
}
 
</code>
 
</code>
 
  
 
== Ver también ==
 
== Ver también ==

Revisión del 18:47 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.
       //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