我想要一个帮助器类来获取当前日期。由于将来的测试问题(可能需要返回与系统时间不同的时间),我想避免在代码中包含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的构造器即可。

10-06 07:52