@@ -486,20 +486,24 @@ private static <K, V> Map<K, V> mapWithoutExpectedEntries(Map<K, V> actual, Entr
486486 // Stream API avoided for performance reasons
487487 try {
488488 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 );
492490 return clonedMap ;
493491 } catch (NoSuchMethodException | UnsupportedOperationException e ) {
494492 // actual cannot be cloned or is unmodifiable, falling back to LinkedHashMap
495493 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 );
499495 return copiedMap ;
500496 }
501497 }
502498
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+
503507 public <K , V > void assertContainsExactly (AssertionInfo info , Map <K , V > actual , Entry <? extends K , ? extends V >[] entries ) {
504508 doCommonContainsCheck (info , actual , entries );
505509 if (actual .isEmpty () && entries .length == 0 ) return ;
0 commit comments