Alex Rivera | Logout

In Grails, is there a good way to mock the current time using Joda time?

Asked 2011-05-25T20:56:13.650
9

I'm writing some code that does date and time calculations against the current time. In Joda time, this is accessed through a (Java) constructor, as it is an immutable object. I need to be able to mock so that new DateTime() returns a specific constant instant so I can do sensible test assertions, but leave all other DateTime methods alone.

This is proving nasty. Grails mockFor(DateTime, true) won't let me mock a Java constructor, yet there is no obvious or readable non-constructor way of getting the time in Joda time.

The only available options seem to involve low-level JVM techniques like JMockit or EasyMock 3 class mocking, which are a pain from Grails. Is there a simple/straightforward way to achieve this?

Edit
Report

1 Answer

19

I know this as already been accepted, but with Joda-time you can freeze and set it to be whatever you like. So you can freeze time, advance time, go backwards in time. Provided you're using Joda consistently, your objects will get "now" as whatever time you've set that to be.

// Stop time (and set a particular point in time):
DateTimeUtils.setCurrentMillisFixed(whenever);

// Advance time by the offset:
DateTimeUtils.setCurrentMillisOffset(offsetFromCurrent);

// Restore time (you could do this in an @After method)
DateTimeUtils.setCurrentMillisSystem();
answered 2011-05-26T13:51:23.693

Your Answer