Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to verify Map size using Hamcrest

Map<Integer, Map<String, String>> mapMap = new HashMap<Integer,Map<String, String>>(); 

Currently asserting like this

assertThat(mapMap.size(), is(equalTo(1))); Or assertThat(mapMap.values(), hasSize(1)); 

Are there any other methods like one used with Lists.

assertThat(someListReferenceVariable, hasSize(1));

like image 203
Ramesh Avatar asked Mar 16 '16 08:03

Ramesh


People also ask

What is a Hamcrest matcher?

Hamcrest is a framework for writing matcher objects allowing 'match' rules to be defined declaratively. There are a number of situations where matchers are invaluable, such as UI validation or data filtering, but it is in the area of writing flexible tests that matchers are most commonly used.

What is org Hamcrest matchers in?

Hamcrest is the well-known framework used for unit testing in the Java ecosystem. It's bundled in JUnit and simply put, it uses existing predicates – called matcher classes – for making assertions.

What is the use of Hamcrest dependency?

Hamcrest is a widely used framework for unit testing in the Java world. Hamcrest target is to make your tests easier to write and read. For this, it provides additional matcher classes which can be used in test for example written with JUnit. You can also define custom matcher implementations.


2 Answers

The good news

There is a matcher that does exactly what you want in the current master branch of the JavaHamcrest project. You can call it like so:

assertThat(mapMap, aMapWithSize(1)); 

And the bad news

Unfortunately this matcher is not in the latest release of Hamcrest (1.3).

[Update] And finally the very good news

The aforementioned matcher is included in the newly released version 2.1.

like image 154
eee Avatar answered Oct 22 '22 05:10

eee


There is none in Hamcrest 1.3, but you can very easily create your own:

public class IsMapWithSize<K, V> extends FeatureMatcher<Map<? extends K, ? extends V>, Integer> {     public IsMapWithSize(Matcher<? super Integer> sizeMatcher) {         super(sizeMatcher, "a map with size", "map size");     }      @Override     protected Integer featureValueOf(Map<? extends K, ? extends V> actual) {         return actual.size();     }      /**      * Creates a matcher for {@link java.util.Map}s that matches when the      * <code>size()</code> method returns a value that satisfies the specified      * matcher.      * <p/>      * For example:      *       * <pre>      * Map&lt;String, Integer&gt; map = new HashMap&lt;&gt;();      * map.put(&quot;key&quot;, 1);      * assertThat(map, isMapWithSize(equalTo(1)));      * </pre>      *       * @param sizeMatcher      *            a matcher for the size of an examined {@link java.util.Map}      */     @Factory     public static <K, V> Matcher<Map<? extends K, ? extends V>> isMapWithSize(Matcher<? super Integer> sizeMatcher) {         return new IsMapWithSize<K, V>(sizeMatcher);     }      /**      * Creates a matcher for {@link java.util.Map}s that matches when the      * <code>size()</code> method returns a value equal to the specified      * <code>size</code>.      * <p/>      * For example:      *       * <pre>      * Map&lt;String, Integer&gt; map = new HashMap&lt;&gt;();      * map.put(&quot;key&quot;, 1);      * assertThat(map, isMapWithSize(1));      * </pre>      *       * @param size      *            the expected size of an examined {@link java.util.Map}      */     @Factory     public static <K, V> Matcher<Map<? extends K, ? extends V>> isMapWithSize(int size) {         Matcher<? super Integer> matcher = equalTo(size);         return IsMapWithSize.<K, V> isMapWithSize(matcher);     }  } 

Testing:

    Map<String, Integer> map = new HashMap<>();     map.put("key", 1);     assertThat(map, isMapWithSize(1));     assertThat(map, isMapWithSize(equalTo(1))); 
like image 25
Ruben Avatar answered Oct 22 '22 06:10

Ruben