Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Verifying Datetime and Date With Hamcrest

DZone's Guide to

Verifying Datetime and Date With Hamcrest

The hamcrest-date library is a great tool for verifying dates in JUnit tests with Hamcrest.

· Java Zone ·
Free Resource

Get the Edge with a Professional Java IDE. 30-day free trial.

Since I started diving into automated testing and practicing TDD, verification of date values has been a  pain. Luckily there is a nice library for legacy Date and new Java 8 DateTime APIs, which cures this pain.

If you belong to healthier part of the Java development community and you're practicing unit testing on daily basis, you are probably are aware of the Hamcrest Java library. It can make your tests much more readable. Its architecture is very modular and is used by various other testing libraries.

A major part of its flexibility is it concept of a Matcher. I am not going to dive into this concept now. If you are not familiar, just take a quick look at the Hamcrest tutorial. One of the matchers you can plug into your testing toolbox is the library hamcrest-date. With this library we can easily test that a date was generated within certain range:

@Test
 public void validateDate() {
 //GIVEN
 Date expectedDate = new Date();

 //WHEN
 Date actualDate = new Date();

 //THEN
 assertThat(actualDate, DateMatchers.within(2, ChronoUnit.SECONDS, expectedDate));
 }

We can also do this for Java 8 types:

@Test
 public void validateDateTime() {
 //GIVEN
 LocalDateTime expectedDateTime = LocalDateTime.now();

 //WHEN
 LocalDateTime actualDateTime = LocalDateTime.now();

 //THEN
 assertThat(actualDateTime, LocalDateTimeMatchers.within(2, ChronoUnit.SECONDS, expectedDateTime));
 }

Or pick from various exotic verifications the hamcrest-core library provides:

@Test
 public void validateZonedDateTime() {
 //GIVEN
 ZonedDateTime expectedDateTime = ZonedDateTime.of(2016, 3, 20, 13, 3, 0, 0, ZoneId.of("GMT+1"));

 //WHEN
 ZonedDateTime actualDateTime = ZonedDateTime.of(2016, 3, 20, 13, 3, 0, 0, ZoneId.of("GMT-0"));

 //THEN
 assertThat(actualDateTime, ZonedDateTimeMatchers.sameDay(expectedDateTime));
 assertThat(actualDateTime, ZonedDateTimeMatchers.after(expectedDateTime));
 assertThat(actualDateTime, ZonedDateTimeMatchers.isSunday());
 assertThat(actualDateTime, ZonedDateTimeMatchers.isMarch());
 }

Kudos to the creator of this nice little library. This example is hosted in Github.

Get the Java IDE that understands code & makes developing enjoyable. Level up your code with IntelliJ IDEA. Download the free trial.

Topics:
java ,junit ,hamcrest

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}