如何在Spring中抽象java.time.Clock以进行测试

如何在Spring中抽象java.time.Clock以进行测试,第1张

概述关于问题Time dependent unit tests,我有一个问题假设我构建了包含服务接口及其实现的Spring应用程序如果我想在测试中改变时钟,我将不得不“污染”生产代码并与之接口. setClock方法如下:public interface MyService { void heavyBusinessLogic(); void se

关于问题Time dependent unit tests,我有一个问题

假设我构建了包含服务接口及其实现的Spring应用程序

如果我想在测试中改变时钟,我将不得不“污染”生产代码并与之接口. setClock方法如下:

public interface MyService {    voID heavyBusinessLogic();    voID setClock(Clock clock);}@Servicepublic class MyServiceImpl implements MyService {    private Clock clock = Clock.systemDefaultZone();    @OverrIDe    public voID heavyBusinessLogic() {        if (LocalDate.Now(clock)...) {            ...         }    }    @OverrIDe    public voID setClock(Clock clock) {        this.clock = clock;    }}   

在测试中,我可以调用,例如:

service.setClock(Clock.fixed(Instant.parse("2017-02-14T01:22:00Z"),ZoneOffset.UTC));

如何在Spring中消除这种跨领域的关注?

我想坚持使用java.time.Clock(我不想使用Joda)

最佳答案就个人而言,我只需在构造函数中添加时钟……

public MyServiceImpl(Clock clock) {  this.clock = clock;}

…也许添加一个不错的默认构造函数……

public MyServiceImpl() {  this(Clock.systemDefaultZone());}

这样,您可以通过spring获取默认值并手动创建自定义时钟版本,例如在测试中.

当然,您也可以放弃默认构造函数,只需在生产配置中添加一个Clock bean,例如这样……

@Beanpublic Clock clock() { return Clock.systemDefaultZone();}

…允许您在测试配置中使用模拟时钟作为bean,自动允许Spring通过构造函数注入@autowire. 总结

以上是内存溢出为你收集整理的如何在Spring中抽象java.time.Clock以进行测试全部内容,希望文章能够帮你解决如何在Spring中抽象java.time.Clock以进行测试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1263452.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存