WebServiceGatewaySupportを使用してSpring WSクライアントを作成しようとしています。私は成功した要求と応答のためにクライアントをテストすることができました。さて、私は石鹸の欠陥のテストケースを書きたいと思っていました。Spring WSクライアントでのSoapFault処理 - WebServiceGatewaySupportとWebServiceTemplate
public class MyClient extends WebServiceGatewaySupport {
public ServiceResponse method(ServiceRequest serviceRequest) {
return (ServiceResponse) getWebServiceTemplate().marshalSendAndReceive(serviceRequest);
}
@ActiveProfiles("test")
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringTestConfig.class)
@DirtiesContext
public class MyClientTest {
@Autowired
private MyClient myClient;
private MockWebServiceServer mockServer;
@Before
public void createServer() throws Exception {
mockServer = MockWebServiceServer.createServer(myClient);
}
}
私の質問は私のカスタムFaultMessageResolverは、SOAPフォルトをアンマーシャリングすることができるようになりますように、私は、モックサーバ内のSOAP障害応答をスタブはどうすればよいのですか?
私は以下のいくつかを試しましたが、何も機能しませんでした。
// responsePayload being SoapFault wrapped in SoapEnvelope
mockServer.expect(payload(requestPayload))
.andRespond(withSoapEnvelope(responsePayload));
// tried to build error message
mockServer.expect(payload(requestPayload))
.andRespond(withError("soap fault string"));
// tried with Exception
mockServer.expect(payload(requestPayload))
.andRespond(withException(new RuntimeException));
助けてください。ありがとう!
フォローアップ:
[OK]をので、withSoapEnvelope(ペイロード)は、私は私のカスタムMySoapFaultMessageResolverに行くために、コントローラを得ることができました。
public class MyCustomSoapFaultMessageResolver implements FaultMessageResolver {
private Jaxb2Marshaller jaxb2Marshaller;
@Override
public void resolveFault(WebServiceMessage message) throws IOException {
if (message instanceof SoapMessage) {
SoapMessage soapMessage = (SoapMessage) message;
SoapFaultDetailElement soapFaultDetailElement = (SoapFaultDetailElement) soapMessage.getSoapBody()
.getFault()
.getFaultDetail()
.getDetailEntries()
.next();
Source source = soapFaultDetailElement.getSource();
jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setContextPath("com.company.project.schema");
Object object = jaxb2Marshaller.unmarshal(source);
if (object instanceof CustomerAlreadyExistsFault) {
throw new CustomerAlreadyExistsException(soapMessage);
}
}
}
}
真剣に!!!すべてのメッセージをアンマーシャルして、そのインスタンスをチェックしなければならなかった。クライアントであれば、サービスの可能性があるすべての例外を徹底的に熟考し、カスタムランタイム例外を作成してリゾルバからスローする必要があります。まだ最後には、WebServiceTemplateにキャッチされ、実行時の例外としてスローされます。
この問題の解決策を見つけましたか? –
本当に!私は別のクライアントを使用して終了しました –
私の答えをチェックアウト。多分それは解決策です。 –