我已经使用Spring-WS编写SOAP端点,并且现在正在编写一些测试。但是,当我尝试发送请求时,我在Spring的doFilter()
类的MockFilterChain
中收到一个404消息,我不知道为什么。我还需要嘲笑吗?
我的端点是一个SOAP模拟器,它从项目中的另一个包中提取它使用的WSDL生成的源文件,以避免不必要的重复。因此,我无法直接访问WSDL文件作为类路径资源。
我的项目如下:
端点
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
@Endpoint
public class MockSoapEndpoint {
private final ObjectFactory objectFactory = new ObjectFactory();
...
...
@PayloadRoot(namespace = NAMESPACE, localPart = "soapEndpoint")
@ResponsePayload
public JAXBElement<MySoapResponse> chargeVolume(@RequestPayload JAXBElement<MySoapRequest> request) {
...
...
}
配置
@EnableWs
@Configuration
public class MockSoapConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean messageDispatcherServlet(final ApplicationContext applicationContext) {
MessageDispatcherServlet messageDispatcherServlet = new MessageDispatcherServlet();
messageDispatcherServlet.setApplicationContext(applicationContext);
messageDispatcherServlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(messageDispatcherServlet, "/ws/*");
}
}
测试
@WebMvcTest
@ContextConfiguration(classes = { MockSoapConfig.class, MockSoapEndpoint.class })
@ExtendWith(SpringExtension.class)
class MockSoapEndpointTest {
private static final String SOAP_REQUEST = ""
+ "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\n"
+ "<soapenv:Header/>..."</soapenv:Envelope>\n";
@Autowired
private MockMvc mockMvc;
@Test
void givenNonRejectedMdnReturnChargingInformationWithCorrectMinMajCodes() throws Exception {
final String endpoint = "http://localhost:8080/ws";
mockMvc.perform(post(endpoint).contentType(MediaType.TEXT_XML)
.content(SOAP_REQUEST)
.accept(MediaType.TEXT_XML))
.andExpect(status().isOk());
}
}
此测试返回404
响应代码,而不是我期望的200
。当我使用http://localhost:8080/ws
和相同的XML块手动测试端点时,它工作正常。
答案 0 :(得分:0)
您应该使用MockWebServiceClient而不是MockMvc
。
正如前面提到的here,MockMvc
仅扫描@RestController/@Controller
并省略@Endpoint
,因此您的映射/ws/*
不存在,并且您没有正确的{ {1}}。
您的测试将如下所示:
MessageDispatcher