我想要一个帮助器类来获取当前日期。由于将来的测试问题(可能需要返回与系统时间不同的时间),我想避免在代码中包含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,但允许使用模拟?
最佳答案
易于测试是依赖注入的好处之一。使用类似Spring的框架,您可以从外部配置依赖项。因此,您的实现将使用spring配置运行,而单元测试将使用通过构造函数或属性设置器提供的模拟运行。这消除了上面两个构造器的需要,您只需要使用一个接受DateHelper的构造器即可。