Inicio > Java > Mock para HttpServletResponse: Test unitario para un StreamResolution

Mock para HttpServletResponse: Test unitario para un StreamResolution

Stripes es un framework del que no he hablado en mis publicaciones, pero con el que trabajo todos los días. Para no entrar en detalles, Stripes es un framework utilisable en la capa de presentación que puede interfasarse fácilmente con una capa Spring de Lógica de negocio.  Uno de los principios de Stripes es que una interfaz de usuario está conectada con un ActionBean, clase que asocia cada campo de un formulario con sus atributos. Los métodos de un ActionBean pueden conectarse a los eventos del formulario y se les identifica por tener la anotación @DefaultEvent o @HandleEvent. Normalmente, estos métodos retornan un objeto de tipo Resolution, que, dando una definición ordinaria, permite la redirección de la página después del tratamiento.

Hay diferentes implementaciones de Resolution, pero la que hoy me interesa presentarles es StreamResolution. Este tipo de Resolution tiene como objetivo enviar datos al cliente más que reridigir a otra página. Uno de sus usos entonces es para presentar información en formato XML o JSON como si se tratara de un WebService. El otro día tuve que trabajar con método que efectuaba precisamente este trabajo, pero lo que me interesaba mas que la salida del flujo XML en la pantalla, era la creación de un test unitario para poder probar el código. Consideremos el siguiente método dentro de un ActionBean:

@DefaultEvent
public Resolution getResults() {
___final ResultDTO resultDTO = new ResultDTO();
___LinkedList<BookDTO> books = catalogueService.find(keyword);
___resultDTO.setBooks(books);
___XStream xStream = new XStream();
___return new StreamingResolution("text/xml", new StringReader(xStream.toXML(resultDTO)));
}

Podemos suponer que para llamar a este método pudimos haber pasado por una URL ligada al ActionBean y que el parametro keyword viene en el request. Con este valor recuperamos una lista de BookDTO que vamos luego a serializar en formato XML gracias a un objeto de la classe com.thoughtworks.xstream.XStream. Supogamos que éste tiene la siguiente estructura:

<ResultDTO>
___<books class="linked-list">
______<BookDTO>
_________<title>Maus</title>
_________<author>Art. Spiegelman</author>
______</BookDTO>
______<BookDTO>
_________<title>La Reina del Sur</title>
_________<author>Arturo Peréz Reverte</author>
______</BookDTO>
___</books>
</ResultDTO>

Ahora, lo que nos interesa es, a partir de la salida que hemos supuesto, testear el código del método. En el test unitario, además de llamar el método, debemos evaluar los valores dentro del objeto Resolution.

En debug es fácil acceder a resolution.contentType o al resolution.reader que contiene el flujo en xml. Sin embargo, esto no es posible en el test ya que estos atributos son privados. En tiempo de ejecución normal, es el objeto response que contiene también el flujo à mostrar. En este caso, podemos pasar por este objeto para recuperar esta informacion. Solo que estamos en un contexto de test Unitario, y no hay acceso a las implementaciones estandar de  es HttpServletResponse.

Para contornar este problema, existe una clase del API Spring nos permite mockear HttpServletResponse : MockHttpServletResponse. Para poder llenar las informaciones en el objeto response, debemos ademas de llamar el metodo del actionBean, invocar el método execute de la resolution, pasando precisamente como parametro el objeto response. Teniendo esto, podemos luego recuperar el ContentType y la sálida de texto. Con esto nuestro test sera:

@Test
public void verifiy_xml_conversion() throws Exception {
___when( catalogueService.find(( anyString() ) ).thenReturn(results);
___HttpServletRequest request = new MockHttpServletRequest();
___HttpServletResponse response = new MockHttpServletResponse();

___StreamingResolution resolution = (StreamingResolution) actionBean.getResults();
___resolution.execute(request, response);

___Assert.assertEquals(response.getContentType(), "text/xml");
___Assert.assertEquals( ((MockHttpServletResponse) response).getOutputString(), xmlOutPut);
}

donde xmlOutPut es un objeto String que contiene la sálida del XML que se mostró más arriba.

  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Hype Driven Development

coz' geeks love new stuff !

My experiments with SCRUM

Site to discuss Agile (Scrum, XP, etc) concepts and ideas.

CommitStrip

Mi propia cheatsheet...

Chris Aniszczyk's (zx) diatribe

work. life. open source. diatribes.

GermanTrevi

repositorio de mi mente...

A %d blogueros les gusta esto: