如何使用 power mock 模拟将 List 类型作为参数的私有方法? [复制]

Posted

技术标签:

【中文标题】如何使用 power mock 模拟将 List 类型作为参数的私有方法? [复制]【英文标题】:How to mock a private method which is taking List type as a parameter using power mock? [duplicate] 【发布时间】:2018-03-06 09:08:22 【问题描述】:

大家好,我正在尝试模拟一个将 List 类型作为参数的私有方法 部分代码详细信息如下:

客户验证类

    public class CustomerVerification

creditCheck.setSuffix(null);
        String pinAndPreciseId = null;
        try 
            pinAndPreciseId = executeCreditCheck(creditCheck, errorResponses, transactionId);
            if (pinAndPreciseId.contains("Error")) 
                ErrorResponse errorResponse = new ErrorResponse("EXPERIAN", pinAndPreciseId, "E01", transactionId);
                errorResponses.add(errorResponse);
                customerVerification.setErrorResponses(errorResponses);
                return customerVerification;
            
         catch (Exception e) 
            throw new EnterpriseCustomerVerificationException(e.getMessage());
         

        

executeCreditCheck 类

private String executeCreditCheck(CreditCheck creditCheck, List<ErrorResponse> errorResponses, String transactionId)
            throws UnsupportedOperationException, IOException 
        LOG.info("Calling experian");
        String pinAndPreciseId = null;
        String request = null;
        String referenceId = null;
        DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        Date today = new Date();
        referenceId = formatter.format(today);

        HttpPost experianHttpPost = getExperianHttpPostMethod();
        NetConnectRequest netConnectRequest = ExperianCreditMapper.map(creditCheck, eai, dbHost, referenceId,
                experianProduct, opInitials, preamble, subCode, arfVersion, venderNumber, vendorVersion, null,
                CustomRRDashKeyword);
        System.err.println("REQUEST -- " + netConnectRequest.toString());
        request = "NETCONNECT_TRANSACTION=" + URLEncoder.encode(netConnectRequest.toString());

        experianHttpPost.setEntity(new ByteArrayEntity(request.getBytes("UTF-8")));
        HttpResponse response = experianHttpClient.execute(experianHttpPost);
        pinAndPreciseId = ExperianCreditMapper.getPIN(response);
        return pinAndPreciseId;
    

谁能给我一个关于如何模拟 私有方法 executeCreditCheck 的想法,该方法采用 3 个参数,其中一个是 List 类型。

注意:我在这里只给出了部分代码。请有人给 我有一个关于如何模拟 executeCreditCheck 方法的想法。

【问题讨论】:

A) 你会考虑在这里使用间谍。 B)基本上你在这里有难以测试的代码。与其以某种方式进行测试,不如退后一步思考改进设计的方法……这样测试变得更容易。 【参考方案1】:

关于不测试私有方法或如何测试的天气存在巨大争议。就个人而言,我不直接测试私有方法。会有调用私有方法的公共方法,我更喜欢间接测试,我可能做错了。

回到你的问题,

您可以使用 powermock Whitebox.invokeMethod() 来测试私有方法。它的语法是

WhiteboxImpl.invokeMethod(<class object>, “<Name of the private Method>",input param1, input param2,…);

【讨论】:

我支持您不要测试私有方法的观点,因为此测试通常可能会在您修改 implelentation 而不改变行为的 refactorings 期间中断。但是 UnitTests 只有在单元行为发生变化时才应该停止,以便在重构期间成为安全防护。

以上是关于如何使用 power mock 模拟将 List 类型作为参数的私有方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

jest.mock():如何使用工厂参数模拟 ES6 类默认导入

如何使用 power mock 对 Spring Boot Rest 控制器和异常处理程序进行单元测试

vue项目中使用模拟数据 MOCK

如何使用 Rhino Mocks 模拟任意行为?

如何使用 Mock Service Worker 在自定义钩子中模拟获取?

如何使用power automate将excel中的数据导入SharePoint list?