代理静态API以使代码可以在Java中测试

时间:2018-02-16 10:34:15

标签: java refactoring legacy

问题在于:

我正在使用Java迁移大型遗留应用程序,我需要使用某些(相当大)的静态方法公开的旧API。我们现在不能避免使用这些方法,这些方法正在制作一大堆东西,例如请求数据库等等。使用这样的方法会使我的代码很难测试,我想知道如果我向这些API引入一些非静态代理,可能会有什么利弊?

考虑以下示例:

package my.legacy.project.util;

class LegacyRulesUtil {
    ...
    public static IBusinessRules getRules(IQuery query) { ... }
    ...
}


package my.new.project.service.proxy;

@Service
class LegacyRulesProxyService {
    ...
    public IBusinessRules getRules(IQuery query) {
        return LegacyRulesUtil.getRules(query);
    }
    ...
}


package my.new.project.consumer;

@Component
class Consumer {

    private final LegacyRulesProxyService legacyRulesProxy;

    @Autowired
    public Consumer(LegacyRulesProxyService legacyRulesProxy) {
        this.legacyRulesProxy = legacyRulesProxy;
    }

    public void consume() {
        ...
        legacyRulesProxy.getRules(query);
        ...
    }
}

或者你可能知道一些不错的选择吗?

我的主要目标是使代码易于测试。在使用代理时,我可以模拟它们并对方法调用进行一些断言,或者只是从它们返回一些虚拟数据并断言最终结果。

2 个答案:

答案 0 :(得分:3)

这绝对是正确的方式......部分。

理想情况下,您不是简单地代理现有的"实用程序" - 类,而是创建真正的域对象。那些最初委托给静态但你可以实现它们的新方式"一步一步。

也就是说,我会优先采用一种外观模式而不是建议的代理模式。

答案 1 :(得分:0)

PowerMockito可用于模拟代码中的静态方法。而不是你创建代理,它将为你完成。 PowerMockito mock single static method and return object