Context
I am writing a simple JUnit test for the MyObject class.
A MyObject can be created from a static factory method that takes a varargs of String.
MyObject.ofComponents("Uno", "Dos", "Tres");
At any time during the existence of MyObject, clients can inspect the parameters it was created by in the form of a List<E>, through the .getComponents() method.
myObject.ofComponents(); // -> List<String>: { "Uno", "Dos", "Tres" }
In other words, a MyObject both remembers and exposes the list of parameters that brought it into existence. More details about this contract:
- The order of
getComponentswill be the same as the one chosen for object creation - Duplicate subsequent String components are allowed and retained in order
- Behaviour on
nullis undefined (other code guarantees nonullgets to the factory) - There are no ways to alter the list of components after object instantiation
I am writing a simple test that creates a MyObject from a list of String and checks that it can return the same list via .getComponents(). I do this immediately but this is supposed to happen at a distance in a realistic code path.
Code
Here my attempt:
List<String> argumentComponents = Lists.newArrayList("One", "Two", "Three");
List<String> returnedComponents =
MyObject.ofComponents(
argumentComponents.toArray(new String[argumentComponents.size()]))
.getComponents();
assertTrue(Iterables.elementsEqual(argumentComponents, returnedComponents));
Question
- Is Google Guava
Iterables.elementsEqual()the best way, provided I have the library in my build path, to compare those two lists? this is something I have been agonizing about; should I use this helper method which goes over an Iterable<E>.. check size and then iterate running.equals().. or any other of the methods that an Internet search suggests? what’s the canonical way to compare lists for unit tests?
I prefer using Hamcrest because it gives much better output in case of a failure
Instead of reporting
expected true, got falseit will report
expected List containing "1, 2, 3, ..." got list containing "4, 6, 2, ..."IsIterableContainingInOrder.contain
Hamcrest
According to the Javadoc:
So the
listUnderTestmust have the same number of elements and each element must match the expected values in order.