问题在于:
我正在使用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);
...
}
}
或者你可能知道一些不错的选择吗?
我的主要目标是使代码易于测试。在使用代理时,我可以模拟它们并对方法调用进行一些断言,或者只是从它们返回一些虚拟数据并断言最终结果。
答案 0 :(得分:3)
这绝对是正确的方式......部分。
理想情况下,您不是简单地代理现有的"实用程序" - 类,而是创建真正的域对象。那些最初委托给静态但你可以实现它们的新方式"一步一步。
也就是说,我会优先采用一种外观模式而不是建议的代理模式。
答案 1 :(得分:0)
PowerMockito可用于模拟代码中的静态方法。而不是你创建代理,它将为你完成。 PowerMockito mock single static method and return object