我想要一个帮助类来获取当前日期。我想避免在代码中使用new Date()
,因为未来的测试问题(可能需要返回不同于系统时间的时间),我不能使用JodaTime来防止测试问题。
我在想这样的帮手:
public interface DateHelper {
/**
* Returns the current date.
*/
Date now();
}
但是如何向客户提供此接口的模拟? 我能想到的唯一解决方案是:
public ClientOfDateHelper {
private DateHelper dateHelper;
// no-arg constructor that instantiates a standard implementation of DateHelper
public ClientOfDateHelper() {
this.dateHelper = new DefaultDateHelper();
}
// constructor that can be used to pass mock to the client
public ClientOfDateHelper(DateHelper suppliedDateHelper) {
this.dateHelper = suppliedDateHelper;
}
public void foo() {
Date today = dateHelper.now();
// do some work that requires today's date
}
}
是否有一个更优雅的解决方案,需要更少的代码才能使用DateHelper,但它允许使用模拟?
答案 0 :(得分:0)
易于测试是依赖注入的好处之一。使用Spring之类的框架可以从外部配置依赖项。因此,您的实现将使用您的spring配置运行,并且您的单元测试将使用您通过构造函数或属性设置器提供的模拟运行。这消除了对上面两个构造的需要,你只需要使用一个接受DateHelper的构造。