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

De Dos Ideas.
Saltar a: navegación, buscar
(Página creada con '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. <code java> …')
 
 
(No se muestran 2 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
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.  
 
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.  
  
<code java>
+
<code java="java">
 
package com.dosideas.test;
 
package com.dosideas.test;
  
Línea 87: Línea 87:
 
     public void stop() throws Exception {
 
     public void stop() throws Exception {
 
         server.stop();
 
         server.stop();
 +
    }
 +
 +
}
 +
</code>
 +
 +
== El test con JUnit  ==
 +
 +
El siguiente test utiliza la clase anterior para maquetar el [[Web Service]].
 +
 +
<code java="java">
 +
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();
 
     }
 
     }
  
Línea 92: Línea 135:
 
</code>
 
</code>
  
 +
== Ver también ==
  
[[Category:Java]]
+
*[[Jetty]]  
 
+
*[[Web Service]]  
==Ver también==
+
*[[Mock Object]]  
* [[Jetty]]
+
*[[SoapUI]]
* [[Web Service]]
 
* [[Mock Object]]
 
* [[SoapUI]]
 
  
[[Category: Java]]
+
[[Category:Java]] [[Category:TDD]]
[[Category: TDD]]
 

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();
   }

}

Ver también