java - 如何在下面的代码中模拟遗留对象?

标签 java mockito

我一直在使用 mockito 框架编写单元测试。 我有下面的遗留代码,如何在不重构的情况下在 approvalAction 方法中模拟 RemoteService 客户端对象?

public Map<String, String> approvalAction(long documentId, ActionCommandDTO request, FormData formData, byte[] prevData) {

    RemoteService client = getRemoteService();
    String urlString = String.format("formExtensions/%s?%s", formData.getId(), getAuthParam(formData.getRealm()));
    try {
        response = client.postEntity(urlString, String.class, approvalSvcRequestStr);
    } catch (Exception e) {
        // TODO: handle rollback properly for P2P
        handleApprovalActionFailed(documentId, request, formData, prevData);
    }

    return map;
}


private RemoteService getRemoteService() {

    RemoteServiceConfig remoteServiceConfig = (RemoteServiceConfig) this.serviceConfigRegistry.getServiceConfigs().get("approval");
    remoteServiceConfig.setClientID(clientId);
    remoteServiceConfig.setClientSecret(privateSecret);
    RemoteService remoteService = new RemoteService(remoteServiceConfig, authorizationHeaderServiceImpl);

    return remoteService;
}

最佳答案

为什么不让 RemoteService 可以通过构造函数注入(inject),同时还允许默认构造函数?

class YourClass{

    private final RemoteService client;

    public YourClass(RemoteService client){
        this.client = client;
    }

    public YourClass(){
        RemoteServiceConfig remoteServiceConfig = (RemoteServiceConfig) this.serviceConfigRegistry.getServiceConfigs().get("approval");
        remoteServiceConfig.setClientID(clientId);
        remoteServiceConfig.setClientSecret(privateSecret);
        client = new RemoteService(remoteServiceConfig, authorizationHeaderServiceImpl);
    }

    // all of your other methods inside the class

}

Of course you'd have to adapt your already existing constructors. but as you've not shown the whole class this is impossible for me.

这使您在 YourClass 的整个生命周期中只有一个客户端实例。


现在很容易模拟RemoteService。只需使用模拟客户端实例化 YourClass:

RemoteService mock = mock(RemoteService.class);
YourClass toTest = new YourClass(mock);

关于java - 如何在下面的代码中模拟遗留对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54107618/

相关文章:

java - 如何设置SWT Tree的高度?

Java Spring 4 验证失败时,它不渲染表单,而是简单地打印 View 名称

java - 如何从JAVA日历中获取该月的最后一周

java - 更新 Liferay 用户锁定

java - 如何使用 JUnit 5 测试调用 Instant.now() 的代码?

java - 更改测试中最终类的返回值

java - 模拟 java.lang.Exception : Class should be public when I use inner classes in tests

java - 替换 XML 内容中的值的最佳方法?

java - Mockito:与此模拟零交互

java - 在单元测试 Controller 时模拟 Spring Validator