Reputation: 2562
Is there a concise, built-in way to do equals assertions on two like-typed arrays in JUnit? By default (at least in JUnit 4) it seems to do an instance compare on the array object itself.
EG, doesn't work:
int[] expectedResult = new int[] { 116800, 116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);
Of course, I can do it manually with:
assertEquals(expectedResult.length, result.length);
for (int i = 0; i < expectedResult.length; i++)
assertEquals("mismatch at " + i, expectedResult[i], result[i]);
..but is there a better way?
Upvotes: 233
Views: 213568
Reputation: 1006
JUnit 5 we can just import Assertions and use Assertions.assertArrayEquals method
import org.junit.jupiter.api.Assertions;
Assertions.assertArrayEquals(resultArray,actualResult);
Upvotes: 19
Reputation: 24758
Class Assertions in org.junit.jupiter.api
Use:
public static void assertArrayEquals(int[] expected,
int[] actual)
Upvotes: 1
Reputation: 51
Using junit4 and Hamcrest you get a concise method of comparing arrays. It also gives details of where the error is in the failure trace.
import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;
//...
assertThat(result, is(new int[] {56, 100, 2000}));
Failure Trace output:
java.lang.AssertionError:
Expected: is [<56>, <100>, <2000>]
but: was [<55>, <100>, <2000>]
Upvotes: 5
Reputation: 4280
I prefer to convert arrays to strings:
Assert.assertEquals(
Arrays.toString(values),
Arrays.toString(new int[] { 7, 8, 9, 3 }));
this way I can see clearly where wrong values are. This works effectively only for small sized arrays, but I rarely use arrays with more items than 7 in my unit tests.
This method works for primitive types and for other types when overload of toString
returns all essential information.
Upvotes: 22
Reputation: 7230
I know the question is for JUnit4, but if you happen to be stuck at JUnit3, you could create a short utility function like that:
private void assertArrayEquals(Object[] esperado, Object[] real) {
assertEquals(Arrays.asList(esperado), Arrays.asList(real));
}
In JUnit3, this is better than directly comparing the arrays, since it will detail exactly which elements are different.
Upvotes: 4
Reputation: 86401
Use org.junit.Assert's method assertArrayEquals
:
import org.junit.Assert;
...
Assert.assertArrayEquals( expectedResult, result );
If this method is not available, you may have accidentally imported the Assert class from junit.framework
.
Upvotes: 420
Reputation: 14276
Assert.assertArrayEquals("message", expectedResult, result)
Upvotes: 18
Reputation: 597076
You can use Arrays.equals(..)
:
assertTrue(Arrays.equals(expectedResult, result));
Upvotes: 46