我正在使用spring-ws 2.0.2和spring-ws-test来运行我的SOAP服务器的集成测试。我正在使用与http://static.springsource.org/spring-ws/site/apidocs/org/springframework/ws/test/server/MockWebServiceClient.html
完全相同的方法这是我正在运行的代码,为了简洁而省略了预期的响应XML,因为它与问题无关。
我希望能够在响应有效负载中看到xml,但无法弄清楚如何访问它。如果我在设置响应后设置断点并检查它,我可以看到它有一个类型为SaajSoapMessage的私有messageContext.response,但我无法弄清楚如何访问它,或者是否有更好的方法来查看响应XML。 / p>
package com.example.integration;
import static org.springframework.ws.test.server.RequestCreators.*;
import static org.springframework.ws.test.server.ResponseMatchers.*;
import static org.testng.AssertJUnit.*;
import javax.xml.transform.Source;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.ws.test.server.MockWebServiceClient;
import org.springframework.ws.test.server.ResponseActions;
import org.springframework.xml.transform.StringSource;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@ContextConfiguration(locations={"/transaction-test-context.xml", "/spring-web-services-servlet.xml"})
public class BaseWebServiceIntegrationTest {
@Autowired
private ApplicationContext applicationContext;
private MockWebServiceClient mockClient;
@BeforeClass(groups="integration")
public void createClient() {
assertNotNull("expected applicationContext to be non-null", applicationContext);
mockClient = MockWebServiceClient.createClient(applicationContext);
}
@Test(groups="integration")
public void proofOfConcept() {
assertNotNull("expected mockClient to be non-null", mockClient);
Source requestPayload = new StringSource(
"<s0:ListDevicesRequest " +
"xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' " +
"xmlns:xs='http://www.w3.org/2001/XMLSchema' " +
"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " +
"xmlns:s0='urn:com:example:xmlschema:service:v1.1:DeviceManager.xsd'>" +
"<s0:MacID>66:bb:be:ee:00:00:01:00</s0:MacID>" +
"</s0:ListDevicesRequest>"
);
Source responsePayload = new StringSource("<!-- response omitted for the post, not relevant -->");
ResponseActions response = mockClient.sendRequest(withPayload(requestPayload));
response.andExpect(noFault())
.andExpect(payload(responsePayload));
}
}
编辑以根据请求添加应用程序上下文文件。我们有一些,但下面的是肥皂专用的。
<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation="
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<sec:global-method-security pre-post-annotations="disabled" jsr250-annotations="disabled" />
<tx:annotation-driven/>
<context:component-scan base-package="com.example.integration"/>
<context:component-scan base-package="com.example.signal"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean id="faultService" class="com.example.webservice.fault.FaultService"/>
<bean id="soapDeviceService" class="com.example.webservice.device.SoapDeviceServiceImpl"/>
<!-- 1.1 Endpoints -->
<bean id="deviceManagerEndpoint_v1_1" class="com.example.webservice.spring.DeviceManagerEndpoint">
<property name="soapDeviceService" ref="soapDeviceService"/>
</bean>
<bean class="com.example.webservice.spring.PayloadMethodMarshallingEndpointAdapter">
<property name="marshaller" ref="marshaller"/>
<property name="unmarshaller" ref="marshaller"/>
</bean>
<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="mtomEnabled" value="false"/>
<property name="contextPath" value="com.example.xmlschema.service.v1_0.devicemanager"/>
</bean>
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="interceptors">
<list>
<bean class="com.example.webservice.interceptor.LoggingInterceptor"/>
<ref bean="validatingInterceptor"/>
</list>
</property>
</bean>
<bean id="validatingInterceptor" class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
<property name="schemas">
<list>
<value>/WEB-INF/wsdl/*Types_v*.xsd</value>
</list>
</property>
<property name="validateRequest" value="true"/>
<property name="validateResponse" value="true"/>
</bean>
<bean class="com.example.webservice.spring.SpringWebserviceFaultMappingExceptionResolver">
<property name="order" value="1"/>
<property name="marshaller" ref="marshaller"/>
</bean>
</beans>
答案 0 :(得分:6)
好的,4年太晚了,但这是我的答案,我为此感到骄傲和羞耻: -
.andExpect(
new ResponseMatcher()
{
@Override
public void match(WebServiceMessage request, WebServiceMessage response)
throws IOException, AssertionError
{
response.writeTo(System.out);
}
})
从Java 8开始:
.andExpect((request, response) -> response.writeTo(System.out))
答案 1 :(得分:2)
您可以在spring-ws上下文中安装PayloadLoggingInterceptor,默认情况下会记录所有请求和响应有效负载。像这样配置:
<sws:interceptors>
<bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/>
</sws:interceptors>
查看springource文档以获取更多信息 here
答案 2 :(得分:1)
配置log4j并在log4j中添加配置以显示spring类日志。日志将显示调用spring类的顺序以及发送的请求和响应。
<logger name="org.springframework.ws" additivity="false">
<level value="DEBUG#org.tiaa.infra.logging.TiaaLevel" />
<appender-ref ref="DailyRollingFileAppender"/>
</logger>
答案 3 :(得分:0)
+1 @NeilStevens解决方案......这永远不会太晚!谢谢:-)这是一个轻微的重构,将东西打印到sf4j记录器并使用静态导入的魔力......:
import static SomeTestClass.ResponseOutputMatcher.printResponse;
public class SomeTestClass {
private static final Logger LOG = LoggerFactory.getLogger(SomeTestClass.class);
@Test
public void someTest() {
mockClient.sendRequest(...)
.andExpect(printResponse(LOG))
.andExpect(noFault());
}
@RequiredArgsConstructor
public static class ResponseOutputMatcher implements ResponseMatcher {
private final Logger logger;
public ResponseOutputMatcher() {
this(LoggerFactory.getLogger(ResponseOutputMatcher.class));
}
@Override
public void match(WebServiceMessage request, WebServiceMessage response) throws IOException, AssertionError {
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.writeTo(out);
logger.info(format("Received payload response:\n%s\n%s\n%s", repeat(">", 80), out.toString(), repeat("_", 80)));
}
public static ResponseMatcher printResponse(Logger logger) {
return new ResponseOutputMatcher(logger);
}
}