我的目标是为我的
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 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);