如何在不将模拟 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);
        //....
    }
}