
关于问题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以进行测试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)