如何在不将模拟 class 作为参数传递的情况下模拟 Web 服务调用
How to mock web service call without passing mocked class as parameter
我有一个 Web 服务 class 需要进行单元测试。
这是正在测试的 class
public class ValidatePaymentMessage {
public CsmValidationResultX validatePaymentmsg(String csmName, String base64PayloadXML){
//Call Web Service to validate Payment
CsmValidationResultX responseMsg=null;
PaymentManagerWebService paymentManagerWebService = new PaymentManagerWebService();
PaymentManagerWebServiceImpl serviceAddrs = paymentManagerWebService.getPaymentManagerWebServicePort();
try {
responseMsg = serviceAddrs.validatePayment(csmName, base64PayloadXML);
} catch (MPMWebServiceException e) {
e.printStackTrace();
}
return responseMsg;
}
}
这是我的 Junit class
public class ValidatePaymentMessageTest {
@Test
public void testValidatePaymentmsg() throws MPMWebServiceException {
CsmValidationResultX csmResult= EasyMock.createMock(CsmValidationResultX.class);
PaymentManagerWebServiceImpl paymentManagerImpl = EasyMock.createMock(PaymentManagerWebServiceImpl.class);
EasyMock.expect(paymentManagerImpl.validatePayment("SEPA","BASE64XML")).andReturn(csmResult).anyTimes();
PaymentManagerWebService paymentManager = EasyMock.createMock(PaymentManagerWebService.class);
EasyMock.expect(paymentManager.getPaymentManagerWebServicePort()).andReturn(paymentManagerImpl).anyTimes();
ValidatePaymentMessage validatePayment=new ValidatePaymentMessage();
CsmValidationResultX response = validatePayment.validatePaymentmsg("SEPA", "base64PayloadXML");
System.out.println(response.getCsmValidationResult().isValid());
}
}
当我 运行 这个 Junit 调用实际的 Web 服务而不是模拟一个's.So 请告诉我如何解决这个问题。
您仍在 validatePaymentmsg() 中实例化真正的 PaymentManagerWebService,因此模拟没有帮助。您不能使用 EasyMock 模拟局部变量的构造,但可以使用 PowerMock。因此,如果更改代码以接收 PaymentManagerWebService 的实例不是一个选项,mock its construction with PowerMock.
@RunWith(PowerMockRunner.class)
@PrepareForTest(ValidatePaymentMessage.class)
public class ValidatePaymentMessageTest {
@Test
public void testValidatePaymentmsg() throws MPMWebServiceException {
// .....
PowerMock.expectNew(PaymentManagerWebService.class).andReturn(paymentManager);
//....
}
}
我有一个 Web 服务 class 需要进行单元测试。 这是正在测试的 class
public class ValidatePaymentMessage {
public CsmValidationResultX validatePaymentmsg(String csmName, String base64PayloadXML){
//Call Web Service to validate Payment
CsmValidationResultX responseMsg=null;
PaymentManagerWebService paymentManagerWebService = new PaymentManagerWebService();
PaymentManagerWebServiceImpl serviceAddrs = paymentManagerWebService.getPaymentManagerWebServicePort();
try {
responseMsg = serviceAddrs.validatePayment(csmName, base64PayloadXML);
} catch (MPMWebServiceException e) {
e.printStackTrace();
}
return responseMsg;
}
}
这是我的 Junit class
public class ValidatePaymentMessageTest {
@Test
public void testValidatePaymentmsg() throws MPMWebServiceException {
CsmValidationResultX csmResult= EasyMock.createMock(CsmValidationResultX.class);
PaymentManagerWebServiceImpl paymentManagerImpl = EasyMock.createMock(PaymentManagerWebServiceImpl.class);
EasyMock.expect(paymentManagerImpl.validatePayment("SEPA","BASE64XML")).andReturn(csmResult).anyTimes();
PaymentManagerWebService paymentManager = EasyMock.createMock(PaymentManagerWebService.class);
EasyMock.expect(paymentManager.getPaymentManagerWebServicePort()).andReturn(paymentManagerImpl).anyTimes();
ValidatePaymentMessage validatePayment=new ValidatePaymentMessage();
CsmValidationResultX response = validatePayment.validatePaymentmsg("SEPA", "base64PayloadXML");
System.out.println(response.getCsmValidationResult().isValid());
}
}
当我 运行 这个 Junit 调用实际的 Web 服务而不是模拟一个's.So 请告诉我如何解决这个问题。
您仍在 validatePaymentmsg() 中实例化真正的 PaymentManagerWebService,因此模拟没有帮助。您不能使用 EasyMock 模拟局部变量的构造,但可以使用 PowerMock。因此,如果更改代码以接收 PaymentManagerWebService 的实例不是一个选项,mock its construction with PowerMock.
@RunWith(PowerMockRunner.class)
@PrepareForTest(ValidatePaymentMessage.class)
public class ValidatePaymentMessageTest {
@Test
public void testValidatePaymentmsg() throws MPMWebServiceException {
// .....
PowerMock.expectNew(PaymentManagerWebService.class).andReturn(paymentManager);
//....
}
}