-
Notifications
You must be signed in to change notification settings - Fork 268
Description
Our principle is:
When you call assertThat(foo)
, you're not testing any of the methods of foo. Rather, you're testing the result of some previous call:
UserId id =
employeeService.manager("cpovirk");
assertThat(id).isEqualTo(
UserId.of("jeremymanson"));
So if you use assertThat(foo).containsExactly("a", "b"), you're not testing foo.contains(), foo.containsAll(), or foo.iterator(). With isEqualTo(), it's the same: You're not testing equals(). The only difference between containsExactly() and isEqualTo() is that there's only one way to test equality but many ways to test collection contents. As a result, people assume that they can guess how isEqualTo() is implemented and then rely on it.
(Of course, it turns out that there's more than one way to test equality: You can check == first, as we do.)
We could make this "work." But I fear muddying the waters, encouraging users to depend on more implementation details (even implementation details that aren't what users guess :)). I could also make the case that we'll mildly hurt performance by always calling equals(), but I don't see that as a major concern in the absence of evidence.