使用Java 8 Clock对类进行单元测试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Java 8 Clock对类进行单元测试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1850字,纯文字阅读大概需要3分钟。
内容图文
Java 8引入了java.time.Clock,它可以用作许多其他java.time对象的参数,允许您向它们注入真实或假的时钟.例如,我知道您可以创建一个Clock.fixed(),然后调用Instant.now(时钟),它将返回您提供的固定Instant.这听起来非常适合单元测试!
但是,我无法弄清楚如何最好地使用它.我有一个类,类似于以下内容:
public class MyClass {
private Clock clock = Clock.systemUTC();
public void method1() {
Instant now = Instant.now(clock);
// Do something with 'now'
}
}
现在,我想对这段代码进行单元测试.我需要能够设置时钟以产生固定的时间,以便我可以在不同的时间测试method().很明显,我可以使用反射将时钟成员设置为特定值,但如果我不必使用反射就会很好.我可以创建一个公共setClock()方法,但这感觉不对.我不想在方法中添加Clock参数,因为真正的代码不应该考虑传入时钟.
处理此问题的最佳方法是什么?这是新代码,所以我可以重新组织这个类.
编辑:为了澄清,我需要能够构造一个MyClass对象,但能够让一个对象看到两个不同的时钟值(就好像它是一个常规的系统时钟一样).因此,我无法将固定时钟传递给构造函数.
解决方法:
让我把Jon Skeet的答案和评论放到代码中:
被测试的班级:
public class Foo {
private final Clock clock;
public Foo(Clock clock) {
this.clock = clock;
}
public void someMethod() {
Instant now = clock.instant(); // this is changed to make test easier
System.out.println(now); // Do something with 'now'
}
}
单元测试:
public class FooTest() {
private Foo foo;
private Clock mock;
@Before
public void setUp() {
mock = mock(Clock.class);
foo = new Foo(mock);
}
@Test
public void ensureDifferentValuesWhenMockIsCalled() {
Instant first = Instant.now(); // e.g. 12:00:00
Instant second = first.plusSeconds(1); // 12:00:01
Instant thirdAndAfter = second.plusSeconds(1); // 12:00:02
when(mock.instant()).thenReturn(first, second, thirdAndAfter);
foo.someMethod(); // string of first
foo.someMethod(); // string of second
foo.someMethod(); // string of thirdAndAfter
foo.someMethod(); // string of thirdAndAfter
}
}
内容总结
以上是互联网集市为您收集整理的使用Java 8 Clock对类进行单元测试全部内容,希望文章能够帮你解决使用Java 8 Clock对类进行单元测试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。