Mock de un WS mediante Spring WS

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

Introducción

En esta página explicaremos de qué forma podemos simular el entorno de un Web Service en memoria, de modo tal de poder realizar un test de componentes contra dicho entorno.

Requerimientos

Para mockear un Web Service mediante Spring WS, necesitaremos agregar a nuestro proyecto los siguientes jars:

  • jaxb-api-2.0.jar
  • jaxb-impl-2.0.3.jar
  • xalan-2.7.1.jar (importante que sea esta versión o superior)
  • xmlunit-1.1.jar

Ejemplo

Básicamente, el código para crear un test contra dicho entorno será como el siguiente:

@RunWith(SpringJUnit4ClassRunner.class)

// indicamos a Spring que levante los archivos de configuración que veremos más adelante @ContextConfiguration("spring-configuration.xml") public class ClienteIntegracionTest {

// Creamos el request a enviarle al WS private String request = "<ns2:ClienteRequest xmlns:ns2='http://ejemplo.com.ar/'><ns2:APELLIDO_RAZONSOCIAL>Una razon social</ns2:APELLIDO_RAZONSOCIAL></ns2:ClienteRequest>";

// Creamos el response que nos responderá el WS private String response = "<ns2:ClienteResponse xmlns:ns2='http://ejemplo.com.ar/'><ns2:ID_CLIENTE>123</ns2:ID_CLIENTE></ns2:ClienteResponse>";

//Inyectamos el WebServiceTemplate @Autowired private WebServiceTemplate webServiceTemplate;

// Mockeamos el WebServiceServer private MockWebServiceServer server;

// Clase nuestra que lo consumirá @Autowired private Cliente cliente;

// En el Before levantamos el server pasandole como parámetro al constructor // el webServiceTemplate @Before public void setup() { server = MockWebServiceServer.createServer(webServiceTemplate); }

@Test public void testInvocacionWs() {

// Le damos comportamiento a nuestro WS con el request y el response // antes configurado server.expect(RequestMatchers.payload(new StringSource(request))).andRespond(ResponseCreators.withPayload(new StringSource(response)));

cliente.invocarMetodoQueLlamaAlWs();

// Nos aseguramos que el servicio fue invocado server.verify(); }

}

Dentro de los archivos de configuración que levante Spring, tendremos que configurarle los siguientes beans:

<bean id="wsTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
 <property name="defaultUri" value="http://localhost:8080/" />
 <property name="marshaller" ref="marshaller" />
 <property name="unmarshaller" ref="marshaller" />
</bean>
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
 <property name="classesToBeBound">
  <list>
   <value>com.dosideas.ejemplo.schemas.ClienteRequest</value>
   <value>com.dosideas.ejemplo.schemas.ClienteResponse</value>
  </list>
 </property>
</bean>

Finalmente, el método de nuestra clase cliente, deberá contener

public void invocarMetodoQueLlamaAlWs() { ... ClienteRequest clienteRequest = new ClienteRequest(); ... ClienteResponse clienteResponse = (clienteResponse) webServiceTemplate

       .marshalSendAndReceive(clienteRequest);

... }

Fuente