Java 8 introduced java.time.Clock
which can be used as an argument to many other java.time
objects, allowing you to inject a real or fake clock into them. For example, I know you can create a Clock.fixed()
and then call Instant.now(clock)
and it will return the fixed Instant
you provided. This sounds perfect for unit testing!
However, I'm having trouble figuring out how best to use this. I have a class, similar to the following:
public class MyClass {
private Clock clock = Clock.systemUTC();
public void method1() {
Instant now = Instant.now(clock);
// Do something with 'now'
}
}
Now, I want to unit test this code. I need to be able to set clock
to produce fixed times so that I can test method()
at different times. Clearly, I could use reflection to set the clock
member to specific values, but it would be nice if I didn't have to resort to reflection. I could create a public setClock()
method, but that feels wrong. I don't want to add a Clock
argument to the method because the real code shouldn't be concerned with passing in a clock.
What is the best approach for handling this? This is new code so I could reorganize the class.
Edit: To clarify, I need to be able to construct a single MyClass
object but be able to have that one object see two different clock values (as if it were a regular system clock ticking along). As such, I cannot pass a fixed clock into the constructor.