SpringWS Junit测试异常:找不到请求的端点[SaajSoapMessage

时间:2017-12-11 17:55:41

标签: java spring soap spring-ws spring-test

  

当我尝试使用MockWebServiceClient使用Spring WebService ServerSide集成测试运行Spring Web Service JUnit测试时,我遇到异常。当我运行WebService Junit测试时,我得到一个例外:

找不到请求的端点[SaajSoapMessagehttp://schemas.xmlsoap.org/soap/envelope/} Envelope]

Spring_WS_ServletConfig

@Configuration
@EnableWs
@EnableTransactionManagement
// @ComponentScan({ "com.springws.endpoint", "com.mybatis.", "com.mapstruct" })
// @ImportResource({ "classpath:/SpringConfig/spring-database-config.xml" })
public class Spring_WS_ServletConfig extends WsConfigurerAdapter {

    @Bean("StudentServiceWsdl")
    public DefaultWsdl11Definition orders() throws SQLException {
        DefaultWsdl11Definition definition = new DefaultWsdl11Definition();
        definition.setPortTypeName("StudentService_SpringWS_PortType");
        definition.setLocationUri("http://localhost:8080/MvnSpringMcc/StudentService_SpringWS/");
        definition.setTargetNamespace("com.springws.student/LearnSpringWs");
        definition.setServiceName("SpringWSService");
        // definition.setWsdl(new
        // ClassPathResource("/wsdl/StudentService.wsdl"));
        definition.setSchema(studentsSchema());

        return definition;
    }

    @Bean
    public XsdSchema studentsSchema() {
        Resource resource = new ClassPathResource("/wsdl/StudentTask.xsd");
        return new SimpleXsdSchema(new ClassPathResource("/Schema_Wsdl/StudentTask.xsd"));
    }

    @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors) {
        PayloadValidatingInterceptor validator = new PayloadValidatingInterceptor();
        validator.setValidateRequest(true);
        validator.setValidateResponse(true);
        validator.setSchema(new ClassPathResource("/Schema_Wsdl/StudentTask.xsd"));
    }
}

TestConfig

@Configuration
@ComponentScan({ "com.springws.test", "com.mybatis.mapper.vo", "com.mybatis.service", "com.mapstruct.mapper",
        "com.springws.endpoint", "com.mybatis.mapper" })
//@Import(Spring_WS_ServletConfig.class)
@ImportResource({ "classpath:testResources/spring-ws-test-database-config.xml" })
public class TestConfig {
}

CourseServiceEndPointServerSideIntegrationTest

@EnableTransactionManagement
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestConfig.class, Spring_WS_ServletConfig.class })
public class CourseServiceEndPointServerSideIntegrationTest {
    @Autowired
    ResourceLoader resourceLoader;
    @Autowired
    private ApplicationContext applicationContext;

    private MockWebServiceClient mockClient;

    @Before
    public void createClient() {
        mockClient = MockWebServiceClient.createClient(applicationContext);
    }

    @Test
    public void courseEndpoint() throws Exception {
        Resource requestPayLoad = resourceLoader.getResource("classpath:xmlTestFiles/RequestPayLoad.xml");
        Resource responsePayLoad = resourceLoader.getResource("classpath:xmlTestFiles/ResponsePayLoad.xml");

        mockClient.sendRequest(withPayload(requestPayLoad)).andExpect(payload(responsePayLoad));
    }
}

RequestPayLoad.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:lear="com.springws.student/LearnSpringWs" xmlns:stud="com.springws.student/StudentSchema">
    <soapenv:Header />
    <soapenv:Body>
        <lear:GetCourseRequest>
            <lear:Course>
                <stud:courseID>100</stud:courseID>
            </lear:Course>
        </lear:GetCourseRequest>
    </soapenv:Body>
</soapenv:Envelope>

异常

CourseServiceEndpoint(com.springws.endpoint.CourseServiceEndpoint)  Time elapsed: 0.219 sec  <<< FAILURE!
java.lang.AssertionError: No endpoint can be found for request [SaajSoapMessage {http://schemas.xmlsoap.org/soap/envelope/}Envelope]
    at org.springframework.ws.test.support.AssertionErrors.fail(AssertionErrors.java:39)
    at org.springframework.ws.test.server.MockWebServiceClient.sendRequest(MockWebServiceClient.java:184)
    at com.springws.serverside.test.CourseServiceEndPointServerSideIntegrationTest.courseEndpoint(CourseServiceEndPointServerSideIntegrationTest.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)


Results :

Failed tests:   CourseServiceEndpoint(com.springws.serverside.test.CourseServiceEndPointServerSideIntegrationTest): No endpoint can be found for request [SaajSoapMessage {http://schemas.xmlsoap.org/soap/envelope/}Envelope]

2 个答案:

答案 0 :(得分:0)

最后,我能够解决问题:只需通过MockWebServiceClient.sendRequest的{​​{1}}和withPayload()方法提供肥皂有效载荷信息。

RequestPayLoad.xml

andExpect(payload())

ResponsePayLoad.xml

<lear:GetCourseRequest xmlns:lear="com.springws.student/LearnSpringWs"
    xmlns:stud="com.springws.student/StudentSchema">
    <lear:Course>
        <stud:courseID>100</stud:courseID>
    </lear:Course>
</lear:GetCourseRequest>

答案 1 :(得分:-1)

解决这个问题的更好方法是在 RequestCreators 中更改为适当的方法 和 ResponseMatchers 用于 SOAP 一。

import static org.springframework.ws.test.server.RequestCreators.withSoapEnvelope;
import static org.springframework.ws.test.server.ResponseMatchers.soapEnvelope;

需要在我们的测试方法中进行更改。

之前:

mockClient.sendRequest(withPayload(requestPayLoad)).andExpect(payload(responsePayLoad));

之后:

mockClient.sendRequest(withSoapEnvelope(requestPayLoad)).andExpect(soapEnvelope(responsePayLoad));