2017-03-28 16 views
1

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にキャッチされ、実行時の例外としてスローされます。

+0

この問題の解決策を見つけましたか? –

+0

本当に!私は別のクライアントを使用して終了しました –

+0

私の答えをチェックアウト。多分それは解決策です。 –

答えて

0

あなたはこのような何かを試みることができる:mockWebServiceServerコードのこの部分で

@Test 
public void yourTestMethod() // with no throw here 
{ 
    Source requestPayload = new StringSource("<your request>"); 
    String errorMessage = "Your error message from WS"; 

    mockWebServiceServer 
     .expect(payload(requestPayload)) 
     .andRespond(withError(errorMessage)); 

    YourRequestClass request = new YourRequestClass(); 
    // TODO: set request properties... 

    try { 
     yourClient.callMethod(request);  
    } 
    catch (Exception e) { 
     assertThat(e.getMessage()).isEqualTo(errorMessage); 
    } 
    mockWebServiceServer.verify(); 
} 

MockWebServiceServerクラスのインスタンスを表します。

関連する問題