Compare time with AssertJ

Filed under: Java, TDD, — Tags: AssertJ — Thomas Sundberg — 2020-04-30

AssertJ is a great assertion framework for Java. It is in my opinion much better than any of the available alternatives. Two areas where AssertJ shines are verifying collections and verifying exceptions. It is also extendable, so you can implement custom assertions for your domain objects.

The way to assert something is done using the method assertThat(). A typical example looks like this:

assertThat(actual).isEqualTo(expected);

isEqualTo() is overloaded and can be used for a lot of comparisons.

Time comparision

Comparing time is inherently hard. Time always changes and that create headaches. In most cases when I want to check a timestamp, I have to accept that it is close to the desired value. Checking that it is exactly the same value is sometimes not possible. The tests will end up flaky if you try because the execution environment, your computer or your build robot, isn't fast enough. There will always be a difference of a few microseconds. Or milliseconds.

One way of dealing with this is to use isCloseTo() instead of isEqualTo(). isCloseTo() takes an additional argument, how close should the value be?

TemporalOffset<? super TEMPORAL> offset

The documentation states that it should be a TemporalOffset<? super TEMPORAL> offset. Great!

Except, what is a TemporalOffset<? super TEMPORAL> offset? I have no idea given this explanation.

Digging around in the documentation and looking at examples, I found that an implementation is available using the static method public static TemporalUnitOffset within(long value, TemporalUnit unit).

within(1, ChronoUnit.SECONDS)

It turns out that calling within() like this within(1, ChronoUnit.SECONDS) creates a TemporalUnitOffset that can be used to check that a timestamp is within one second from another timestamp.

A complete call may look like this:

assertThat(actual).isCloseTo(expected, within(1, ChronoUnit.SECONDS));

where actual and expected are two timestamps I want to compare.

Documentation

The Javadoc can be found here: https://www.javadoc.io/static/org.assertj/assertj-core/3.15.0/org/assertj/core/api/AbstractTemporalAssert.html

It includes examples, so it is pretty good. Once I found it.

Conclusion

Comparing timestamps is possible when you crack the code of TemporalOffset<? super TEMPORAL> offset.

Acknowledgements

I would like to thank Malin Ekholm, Mika Kytöläinen, and Henrik Jörnvall for feedback.

Resources



(less...)

Pages

About
Events
Why

Categories

Agile
Automation
BDD
Clean code
Continuous delivery
Continuous deployment
Continuous integration
Cucumber
Culture
Design
DevOps
Executable specification
Git
Gradle
Guice
J2EE
JUnit
Java
Javascript
Kubernetes
Linux
Load testing
Maven
Mockito
New developers
Pair programming
PicoContainer
Presentation
Programming
Public speaking
Quality
React
Recruiting
Requirements
Scala
Selenium
Software craftsmanship
Software development
Spring
TDD
Teaching
Technical debt
Test automation
Tools
Web
Windows
eXtreme Programming

Authors

Thomas Sundberg
Adrian Bolboaca

Archives

Meta

rss RSS