spring ws-client 的单元测试 - 检查是否正在调用 marshalSendAndReceive

问题描述 投票:0回答:1

我的目标是为我的

WebServiceClientImpl
类编写一个单元测试,我想添加一个测试来检查
marshalSendAndReceive
是否被调用。我使用
Mockito
powermockito
框架。我需要使用
powermockito
因为
WebServiceGatewaySupport.getWebServiceTemplate
是最终方法,而
mockito
无法做到。

这是我要测试的课程。

public class WebServiceClientImpl extends WebServiceGatewaySupport implements
WebServiceClient {

@Override
public <T> T execute(final Object requestPayload,
                   final Class<T> responseType,
                   final String soapActionCallBack) {
return (T) getWebServiceTemplate()
             .marshalSendAndReceive(requestPayload, new 
                                    SoapActionCallback(soapActionCallBack));
}

这是我迄今为止的单元测试。

RunWith( PowerMockRunner.class )
@PowerMockRunnerDelegate( HierarchicalContextRunner.class )
@PrepareForTest( WebServiceClientImpl.class )
public class WebServiceClientImplTest {

private WebServiceClientImpl webServiceClientImpl = PowerMockito.mock(WebServiceClientImpl.class);

@Mock
private WebServiceTemplate webServiceTemplate;

@Before
public void before() {
  MockitoAnnotations.initMocks( this );
}

public class Execute {
  Object response = "response";
  Object request = "request";
  SoapActionCallback soapActionCallBack = new SoapActionCallback("soap");

  @Before
  public void before() {

  when( webServiceClientImpl.getWebServiceTemplate() ).thenReturn( webServiceTemplate );
  when( webServiceTemplate.marshalSendAndReceive ( request, soapActionCallBack) ).thenReturn(response);
  response = webServiceClientImpl.execute( request, Object.class, "soapActionCallBack" );
  System.out.println ("RESPONSE " + response );
}


@Test
public void marshalSendAndReceiveInvoked() {
  verify( webServiceTemplate ).marshalSendAndReceive( request, soapActionCallBack );
}

@Test
public void webServiceClientReturnValue() {
  assertEquals( "response", response );
}}}

但是,即使我已将其放入单元测试中,响应仍然为空。

when( webServiceTemplate.marshalSendAndReceive ( request, soapActionCallBack) ).thenReturn(response)

有人可以帮忙进行单元测试吗?任何帮助将不胜感激 - 谢谢!

java spring unit-testing spring-security spring-ws
1个回答
0
投票

您可以使用 Java Reflection API 并手动更改 WebServiceGatewaySupport 中 WebServiceTemplate 的引用(并使用 Mockito 模拟它):

WebServiceTemplate webServiceTemplateMock = mock(WebServiceTemplate.class);

Field webServiceTemplateRef = client.getClass().getSuperclass().getDeclaredField("webServiceTemplate");
webServiceTemplateRef.setAccessible(true);
webServiceTemplateRef.set(client, webServiceTemplate);

现在您可以模拟模板的行为:

Mockito.when(webServiceTemplateMock.marshalSendAndReceive(request, soapActionCallBack)).thenReturn(response);
© www.soinside.com 2019 - 2024. All rights reserved.