Checking that a List is not empty in Hamcrest
Solution 1
Well there's always
assertThat(list.isEmpty(), is(false));
... but I'm guessing that's not quite what you meant :)
Alternatively:
assertThat((Collection)list, is(not(empty())));
empty()
is a static in the Matchers
class. Note the need to cast the list
to Collection
, thanks to Hamcrest 1.2's wonky generics.
The following imports can be used with hamcrest 1.3
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.*;
Solution 2
This is fixed in Hamcrest 1.3. The below code compiles and does not generate any warnings:
// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, is(not(empty())));
But if you have to use older version - instead of bugged empty()
you could use:
hasSize(greaterThan(0))
(import static org.hamcrest.number.OrderingComparison.greaterThan;
or
import static org.hamcrest.Matchers.greaterThan;
)
Example:
// given
List<String> list = new ArrayList<String>();
// then
assertThat(list, hasSize(greaterThan(0)));
The most important thing about above solutions is that it does not generate any warnings. The second solution is even more useful if you would like to estimate minimum result size.
Solution 3
If you're after readable fail messages, you can do without hamcrest by using the usual assertEquals with an empty list:
assertEquals(new ArrayList<>(0), yourList);
E.g. if you run
assertEquals(new ArrayList<>(0), Arrays.asList("foo", "bar");
you get
java.lang.AssertionError
Expected :[]
Actual :[foo, bar]
Related videos on Youtube
Ian Dallas
Updated on April 18, 2020Comments
-
Ian Dallas about 4 years
I was wondering if anyone knew of a way to check if a List is empty using
assertThat()
andMatchers
?Best way I could see just use JUnit:
assertFalse(list.isEmpty());
But I was hoping that there was some way to do this in Hamcrest.
-
Fabricio Lemos over 13 yearsFor a better solution, vote for: code.google.com/p/hamcrest/issues/detail?id=97
-
rafalmag almost 12 years@FabricioLemos issue#97 seems to be resolved and merget to master git branch. Lets hope it will be soon in next hamcrest release.
-
andyb almost 12 years@rafalmag Good spot. Will be good to fix all my not-so-readable assertions when v1.3 is released
-
-
skaffman over 13 yearsI find that Hamcrest code looks much nicer if you change your syntax highlighting to make the parenthesis invisible...
-
Ian Dallas over 13 yearsYour second assertThat() gives me the following error: The method assertThat(T, Matcher<T>) in the type Assert is not applicable for the arguments (List<Integer>, Matcher<Collection<Object>>)
-
skaffman over 13 years@tkeE2036: That's Hamcrest's broken generics at work. Sometimes you need to cast to make it compile, e.g.
assertThat((Collection)list, is(not(empty())));
-
yegor256 about 13 yearscould you please give a link to
Matchers
class where thisempty()
method is defined?org.hamcrest:hamcrest-all:1.1
doesn't have it. -
skaffman about 13 years@yegor256: Hamcrest is at v1.2 now.
-
rafalmag over 12 years@skaffman : in this solution you still get compile warnings, because you do not use generics (and in fact you cant...)
-
dzieciou over 11 yearsIs this really easier to read than simply
assertFalse(list.isEmpty)
? I always believed DSL should remove boilerplate code instead of introducing it. -
Brad Cupit over 11 years@dzieciou it gives you a better error message when the test fails. So instead of
expected true but got false
you get something likeexpected empty but got [1, 2, 3]
-
earcam almost 11 yearsIf you prefer no unchecked conversion, and are willing to give up the static import, then you can add the generics to the method, like:
assertThat(list, Matchers.<String>empty())
(assuming list is a collection ofString
s) -
Christian García almost 11 yearsNote that with the second
assertThat
, the test will pass if the list isnull
, so the test will assert the list is not empty when it actually is (well, actually it's null. There could be a long metaphysical discussion about if a null list can be considered empty, though) -
Dave over 9 yearsIt is really nice to see what was left in the supposedly empty list!
-
Admin over 8 years@Ian this answer is outdated and there are better answers that should be accepted now instead.
-
rafalmag over 8 years@rogerdpack Here you go. I added the 1.3 style example. :)
-
meustrus over 4 yearsI would upvote this 1000 times if I could for the sole reason that unlike most Java answers, this answer actually includes the
import
statements you need to make the solution work. -
IIRed-DeathII about 4 yearsIn kotlin you won't be able to use "is" since it's a reserved word. You need to use it between grave accents:
`is`
->`is`(not(empty())
-
kelgwiin almost 4 yearsthe lib is already fixed, use
assertThat(someList, not(empty()));
is enough