Skip to content

Wakaleo Consulting

  Home Blog Some useful new Hamcrest matchers for collections
  • Training and Mentoring in Test Driven Development
  • Training and Mentoring in Test Driven Development
  • Training and Mentoring in Test Driven Development
  • Expertise in Continuous Integration and Continuous Delivery
  • Expertise in Continuous Integration and Continuous Deployment
  • Expert Jenkins/Hudson training and mentoring
  • Training and Mentoring in Test Driven Development
  • Expertise in Automated Acceptance Tests and ATDD
  • Expertise in quality development and testing practices
Some useful new Hamcrest matchers for collections PDF Print E-mail
Monday, 12 December 2011 11:23

Hamcrest is a neat little library that lets you write more fluent and readable tests. For example, rather than writing:

    assertEquals("red", color);
you would write:
    assertThat(color,is("red"));
This makes for tests that express their intent much more clearly, which in turn makes the tests easier to understand and to maintain, and more likely to be correct. This is generally considered to be a Good Thing.

A version of Hamcrest is actually bundled with JUnit. However it is somewhat dated, and the more recent versions of Hamcrest come with a lot more features, particularly with regards to working with collections. You can use the latest version of Hamcrest by using the junit-dep dependency instead of junit, and configuring your dependencies as shown here:

    <dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit-dep</artifactId>
	    <version>4.10</version>
	    <scope>test</scope>
	    <exclusions>
	        <exclusion>
	            <groupId>org.hamcrest</groupId>
	            <artifactId>hamcrest-core</artifactId>
	        </exclusion>
	    </exclusions>
	</dependency>
	<dependency>
	    <groupId>org.hamcrest</groupId>
	    <artifactId>hamcrest-library</artifactId>
	    <version>1.3.RC2</version>
	</dependency>

You can check the size of a collection directly:

    List colors = Arrays.asList("red","green","blue");
    assertThat(colors, hasSize(3));
You can also check the exact contents of a collection:
    List colors = Arrays.asList("red","green","blue");
    assertThat(colors, contains("red", "green", "blue"));

This last example checks both the contents and the order of the collection. If you are only interested in the contents, you can use containsInAnyOrder:

    List colors = Arrays.asList("red","green","blue");
    assertThat(colors, containsInAnyOrder("green", "red", "blue"));

You can also check that a condition is true for every item in a list:

    List ages = Arrays.asList(21, 25,30);
    assertThat(ages, everyItem(greaterThan(18)));

This version is a release candidate, so there might be a few rough edges before the final version. And since the artifact names have changed, you need to be careful to exclude any references to hamcrest-all used by other libraries (lambdaj, for example, uses Hamcrest).

Tags See All Tags Add New Tag...

Please Enter New Tags Separated By Comma's
  Or Close

JUnit  TDD  hamcrest 

Trackback(0)
Comments (1)Add Comment
0
fest assert
written by Benoit Guerout, December 21, 2011

Unfortunately, with hamcrest matchers you always need to look for the class to import
eg. hasItem method exists in JUnitMatchers, Matchers, CoreMatchers, ...

IHMO more readable tests can be obtain with Fest Assert :
assertThat(newEmployees).hasSize(6).contains(frodo, sam);


junit-dep dependency is no longer needed :

org.easytesting
fest-assert
test


http://docs.codehaus.org/displ...ons+Module

Write comment

busy