blob: 22c9d1be9848114c7f08cc58f9acd5e84f3a8b48 [file] [log] [blame]
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.util.collections;
import org.mockito.internal.util.MockUtil;
/**
* hashCode and equals safe mock wrapper.
*
* <p>
* It doesn't use the actual mock {@link Object#hashCode} and {@link Object#equals} method as they might
* throw an NPE if those method cannot be stubbed <em>even internally</em>.
* </p>
*
* <p>
* Instead the strategy is :
* <ul>
* <li>For hashCode : <strong>use {@link System#identityHashCode}</strong></li>
* <li>For equals : <strong>use the object reference equality</strong></li>
* </ul>
* </p>
*
* @see HashCodeAndEqualsSafeSet
*/
public class HashCodeAndEqualsMockWrapper {
private final Object mockInstance;
public HashCodeAndEqualsMockWrapper(Object mockInstance) {
this.mockInstance = mockInstance;
}
public Object get() {
return mockInstance;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof HashCodeAndEqualsMockWrapper)) return false;
HashCodeAndEqualsMockWrapper that = (HashCodeAndEqualsMockWrapper) o;
return mockInstance == that.mockInstance;
}
@Override
public int hashCode() {
return System.identityHashCode(mockInstance);
}
public static HashCodeAndEqualsMockWrapper of(Object mock) {
return new HashCodeAndEqualsMockWrapper(mock);
}
@Override public String toString() {
MockUtil mockUtil = new MockUtil();
return "HashCodeAndEqualsMockWrapper{" +
"mockInstance=" + (mockUtil.isMock(mockInstance) ? mockUtil.getMockName(mockInstance) : typeInstanceString()) +
'}';
}
private String typeInstanceString() {
return mockInstance.getClass().getSimpleName() + "(" + System.identityHashCode(mockInstance) + ")";
}
}