Skip to content

Commit 3f0adea

Browse files
Stephan202kcooney
authored andcommitted
Improve error message for assertArrayEquals() when multi-dimensional arrays
have different lengths. Previously, JUnit's assertion error message would indicate only that some array lengths x and y were unequal, without indicating whether this pertained to the outer array or some nested array. Now, in case of a length mismatch between two nested arrays, Junit will tell at which indices they reside. Closes #1054 Closes #803
1 parent e4c92d4 commit 3f0adea

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

src/main/java/org/junit/internal/ComparisonCriteria.java

+12-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public abstract class ComparisonCriteria {
2525
*/
2626
public void arrayEquals(String message, Object expecteds, Object actuals)
2727
throws ArrayComparisonFailure {
28+
arrayEquals(message, expecteds, actuals, true);
29+
}
30+
31+
private void arrayEquals(String message, Object expecteds, Object actuals, boolean outer)
32+
throws ArrayComparisonFailure {
2833
if (expecteds == actuals
2934
|| Arrays.deepEquals(new Object[] {expecteds}, new Object[] {actuals})) {
3035
// The reflection-based loop below is potentially very slow, especially for primitive
@@ -34,19 +39,23 @@ public void arrayEquals(String message, Object expecteds, Object actuals)
3439
}
3540
String header = message == null ? "" : message + ": ";
3641

37-
int expectedsLength = assertArraysAreSameLength(expecteds,
38-
actuals, header);
42+
// Only include the user-provided message in the outer exception.
43+
String exceptionMessage = outer ? header : "";
44+
int expectedsLength = assertArraysAreSameLength(expecteds, actuals, exceptionMessage);
3945

4046
for (int i = 0; i < expectedsLength; i++) {
4147
Object expected = Array.get(expecteds, i);
4248
Object actual = Array.get(actuals, i);
4349

4450
if (isArray(expected) && isArray(actual)) {
4551
try {
46-
arrayEquals(message, expected, actual);
52+
arrayEquals(message, expected, actual, false);
4753
} catch (ArrayComparisonFailure e) {
4854
e.addDimension(i);
4955
throw e;
56+
} catch (AssertionError e) {
57+
// Array lengths differed.
58+
throw new ArrayComparisonFailure(header, e, i);
5059
}
5160
} else {
5261
try {

src/test/java/org/junit/tests/assertion/AssertionTest.java

+24
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,30 @@ public void multiDimensionalArraysAreNotEqualNoMessage() {
211211
}
212212
}
213213

214+
@Test
215+
public void multiDimensionalArraysDifferentLengthMessage() {
216+
try {
217+
assertArrayEquals("message", new Object[][]{{true, true}, {false, false}}, new Object[][]{{true, true}, {false}});
218+
} catch (AssertionError exception) {
219+
assertEquals("message: arrays first differed at element [1]; array lengths differed, expected.length=2 actual.length=1", exception.getMessage());
220+
return;
221+
}
222+
223+
fail("Expected AssertionError to be thrown");
224+
}
225+
226+
@Test
227+
public void multiDimensionalArraysDifferentLengthNoMessage() {
228+
try {
229+
assertArrayEquals(new Object[][]{{true, true}, {false, false}}, new Object[][]{{true, true}, {false}});
230+
} catch (AssertionError exception) {
231+
assertEquals("arrays first differed at element [1]; array lengths differed, expected.length=2 actual.length=1", exception.getMessage());
232+
return;
233+
}
234+
235+
fail("Expected AssertionError to be thrown");
236+
}
237+
214238
@Test
215239
public void arraysWithNullElementEqual() {
216240
Object[] objects1 = new Object[]{null};

0 commit comments

Comments
 (0)