Java tutorial
/*- * Copyright (c) * * 2012-2014, Facultad Politcnica, Universidad Nacional de Asuncin. * 2012-2014, Facultad de Ciencias Mdicas, Universidad Nacional de Asuncin. * 2012-2013, Centro Nacional de Computacin, Universidad Nacional de Asuncin. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ package py.una.pol.karaku.test.base; import static org.springframework.ws.test.server.RequestCreators.withPayload; import java.io.IOException; import javax.xml.transform.Source; import org.junit.Before; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.oxm.Marshaller; import org.springframework.oxm.Unmarshaller; import org.springframework.oxm.support.MarshallingSource; import org.springframework.ws.WebServiceMessage; import org.springframework.ws.test.server.MockWebServiceClient; import org.springframework.ws.test.server.RequestCreator; import org.springframework.ws.test.server.ResponseActions; import org.springframework.ws.test.server.ResponseMatcher; import py.una.pol.karaku.test.configuration.WebServiceTestConfiguration; /** * * Base clase para Test que simulen llamadas a WebServices. * * <h3>Beans Disponibles</h3> * <p> * Esta hecha para funcionar en conjunto con {@link WebServiceTestConfiguration} * y disponibiliza los beans mas importantes para la manipulacin de servicios. * <ol> * <li>{@link #marshaller} Sirve para convertir un objeto a un XML</li> * <li> * {@link #unmarshaller} Sirve para convertir un XML a un objeto</li> * </ol> * </p> * <h3>Mtodos Disponibles</h3> * <p> * La mayora de los mtodos para realizar verificacines sobre las respuesta de * los servicios se encuentran en * {@link org.springframework.ws.test.server.RequestCreators} (se recomienda * hacer static import de los mtodos de esta clase). * </p> * <p> * Adems se proveen mtodos muy utilices para la manipulacin de llamadas a * travs de objetos y no de XML, los cuales son (en orden de uso): * <ol> * <li>{@link #getPayload(Object)} retorna un {@link Source} vlido para enviar * a travs de un WS <b>(OPCIONAL)</b></li> * <li> {@link #sendRequest(Object)} que enva una peticin con el objeto, * primero lo <i>marshalea</i> y luego busca el endpoint correspondiente.</li> * <li> {@link #getResponse()} obtiene la respuesta de la ltima llamada * realizada con {@link #sendRequest(Object)}</li> * </ol> * </p> * <h3>Ejemplo de uso</h3> * <p> * * <pre> * @ContextConfiguration(loader = AnnotationConfigContextLoader.class) * public class ClientTest extends BaseTestWebService { * * @Configuration * static class ContextConfiguration extends WebServiceTestConfiguration { * * @Override * (1) public Class<?>[] getClassesToBound() { * * return TestUtils.getAsClassArray(MenuRequest.class, * MenuResponse.class); * } * * * (2) ServerLogic ServerLogic() { * * return new ServerLogic(); * } * * * @Bean * (3) MenuServiceEndpoint menuServiceEndpoint() { * * return new MenuServiceEndpoint(); * } * * } * * @Test * public void testCallMocked() { * * * (4) WSRequest wsRequest = new WSRequest(); * (5) sendRequest(wsRequest). * (6) andExpect(noFault()); * (7) MenuResponse response = getResponse(); * (8) assertEquals("Stock", response.getMenu().getName()); * * } * } * * * </pre> * * <h4>Explicacin</h4> * <ol> * <li>Clases que sern marshalizadas o desmarshalizadas</li> * <li>Beans que utiliza nuestro mtodo servidor</li> * <li>Endpoint para escuchar llamadas</li> * <li>Creamos un objeto para enviar</li> * <li>Enviamos la peticin</li> * <li>Podemos agregar tantos resultados como queramos</li> * <li>Obtenemos la respuesta ya casteada</li> * <li>Validamos el objeto ya convertido</li> * </ol> * </p> * * @author Arturo Volpe * @since 2.2.8 * @version 1.0 Oct 18, 2013 * @see WebServiceTestConfiguration * */ public abstract class BaseTestWebService extends BaseTest { @Autowired protected Marshaller marshaller; @Autowired protected Unmarshaller unmarshaller; @Autowired protected MockWebServiceClient client; private ResponseActions current; private Object result; @Before public void createMock() { result = null; } /** * Envia una peticin al servidor emulado. * <p> * Se diferencia de {@link MockWebServiceClient#sendRequest(RequestCreator)} * en que agrega un validador que almacena desmarshaliza la respuesta y la * almacena para poder utilizarla despues mediante el mtodo * {@link #getResponse()} * </p> * * @param requestCreator * @return * @see org.springframework.ws.test.server.MockWebServiceClient#sendRequest(org.springframework.ws.test.server.RequestCreator) */ public ResponseActions sendRequest(RequestCreator requestCreator) { current = client.sendRequest(requestCreator).andExpect(responseMarshaller()); return current; } /** * Serializa un objeto y enva la peticin. * * <p> * <b>La clase del objeto debe ser una de las retornadas por * {@link WebServiceTestConfiguration#getClassesToBound()}</b> * </p> * <p> * Se diferencia de {@link MockWebServiceClient#sendRequest(RequestCreator)} * en que agrega un validador que almacena desmarshaliza la respuesta y la * almacena para poder utilizarla despus mediante el mtodo * {@link #getResponse()} * </p> * * @param object * objeto a serializar * @return {@link ResponseActions} para agregar validaciones */ public ResponseActions sendRequest(Object object) { return sendRequest(withPayload(getPayload(object))); } /** * Retorna un {@link ResponseMatcher} que marshaliza el resultado. * * <p> * Este {@link ResponseMatcher} no realiza ninguna accin, siempre valida y * se encarga de parsear el resultado * </p> * * @return dummy {@link ResponseMatcher} */ public ResponseMatcher responseMarshaller() { return new ResponseMatcher() { @Override public void match(WebServiceMessage request, WebServiceMessage response) throws IOException, AssertionError { WebServiceMessage dos = response; Source source = dos.getPayloadSource(); result = unmarshaller.unmarshal(source); } }; } /** * Retorna el resultado del ultimo {@link #sendRequest(Object)} vlido (en * este test actual). * * <p> * Para que este mtodo funcione, se debio agregar al menos un * {@link #responseMarshaller()} * </p> * * @return respuesta marshalizada. */ @SuppressWarnings("unchecked") public <T> T getResponse() { return (T) result; } /** * Marshaliza un objeto y lo agrega a un {@link Source} * * <p> * <b>La clase del objeto debe ser una de las retornadas por * {@link WebServiceTestConfiguration#getClassesToBound()}</b> * </p> * * @param o * Objeto a serializar * @return {@link Source} */ public Source getPayload(Object o) { return new MarshallingSource(marshaller, o); } }