@@ -486,20 +486,24 @@ private static <K, V> Map<K, V> mapWithoutExpectedEntries(Map<K, V> actual, Entr
486
486
// Stream API avoided for performance reasons
487
487
try {
488
488
Map <K , V > clonedMap = clone (actual );
489
- for (Entry <? extends K , ? extends V > expectedEntry : expectedEntries ) {
490
- clonedMap .remove (expectedEntry .getKey (), expectedEntry .getValue ());
491
- }
489
+ removeEntries (clonedMap , expectedEntries );
492
490
return clonedMap ;
493
491
} catch (NoSuchMethodException | UnsupportedOperationException e ) {
494
492
// actual cannot be cloned or is unmodifiable, falling back to LinkedHashMap
495
493
Map <K , V > copiedMap = new LinkedHashMap <>(actual );
496
- for (Entry <? extends K , ? extends V > expectedEntry : expectedEntries ) {
497
- copiedMap .remove (expectedEntry .getKey (), expectedEntry .getValue ());
498
- }
494
+ removeEntries (copiedMap , expectedEntries );
499
495
return copiedMap ;
500
496
}
501
497
}
502
498
499
+ private static <K , V > void removeEntries (Map <K , V > map , Entry <? extends K , ? extends V >[] entries ) {
500
+ for (Entry <? extends K , ? extends V > entry : entries ) {
501
+ // must perform deep equals comparison on values as Map.remove(Object, Object) relies on
502
+ // Objects.equals which does not handle deep equality (e.g. arrays in map entry values)
503
+ if (containsEntry (map , entry )) map .remove (entry .getKey ());
504
+ }
505
+ }
506
+
503
507
public <K , V > void assertContainsExactly (AssertionInfo info , Map <K , V > actual , Entry <? extends K , ? extends V >[] entries ) {
504
508
doCommonContainsCheck (info , actual , entries );
505
509
if (actual .isEmpty () && entries .length == 0 ) return ;
0 commit comments