/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import org.junit.*; import mockit.internal.util.*; @SuppressWarnings({ "ObjectEqualsNull", "EqualsBetweenInconvertibleTypes", "LiteralAsArgToStringEquals", "FinalizeCalledExplicitly"}) public final class ObjectOverridesTest { @Test public void verifyStandardBehaviorOfOverridableObjectMethodsInMockedInterface(Runnable a, Runnable b) { assertDefaultEqualsBehavior(a, b); assertDefaultEqualsBehavior(b, a); assertDefaultHashCodeBehavior(a); assertDefaultHashCodeBehavior(b); assertDefaultToStringBehavior(a); assertDefaultToStringBehavior(b); } private void assertDefaultEqualsBehavior(Object a, Object b) { assert !a.equals(null); assert !a.equals("test"); assert a.equals(a); assert !a.equals(b); } private void assertDefaultHashCodeBehavior(Object a) { assert a.hashCode() == System.identityHashCode(a); } private void assertDefaultToStringBehavior(Object a) { assert a.toString().equals(Utilities.objectIdentity(a)); } @Mocked ClassWithObjectOverrides a; @Mocked ClassWithObjectOverrides b; @Test public void verifyStandardBehaviorOfOverriddenObjectMethodsInMockedClass() { assertDefaultEqualsBehavior(a, b); assertDefaultEqualsBehavior(b, a); assertDefaultHashCodeBehavior(a); assertDefaultHashCodeBehavior(b); assertDefaultToStringBehavior(a); assertDefaultToStringBehavior(b); a.finalize(); b.finalize(); } @Test public void mockOverrideOfEqualsMethod() { new Expectations() { { a.equals(null); result = true; a.equals(anyString); result = true; } }; new NonStrictExpectations() { { b.equals(a); result = true; } }; assert a.equals(null); assert a.equals("test"); assert b.equals(a); } @Test public void mockOverrideOfHashCodeMethod() { assert a.hashCode() != b.hashCode(); new NonStrictExpectations() { { a.hashCode(); result = 123; b.hashCode(); result = 45; times = 1; } }; assert a.hashCode() == 123; assert b.hashCode() == 45; } @Test public void mockOverrideOfToStringMethod() { assert !a.toString().equals(b.toString()); new NonStrictExpectations() { { a.toString(); result = "mocked"; } }; assert "mocked".equals(a.toString()); new Verifications() { { a.toString(); b.toString(); times = 1; } }; } @Test public void mockOverrideOfCloneMethod() { new Expectations() { { a.clone(); result = b; } }; assert a.clone() == b; } @Test public void allowAnyInvocationsOnOverriddenObjectMethodsForStrictMocks() { new Expectations() { { a.getIntValue(); result = 58; b.doSomething(); } }; assert !a.equals(b); assert a.hashCode() != b.hashCode(); assert a.getIntValue() == 58; assert a.equals(a); String bStr = b.toString(); b.doSomething(); assert !b.equals(a); String aStr = a.toString(); assert !aStr.equals(bStr); new Verifications() { { a.equals(b); b.hashCode(); times = 1; a.toString(); b.equals(null); times = 0; } }; new VerificationsInOrder() { { a.hashCode(); b.equals(a); } }; } @Test public void recordExpectationsOnOverriddenObjectMethodAsNonStrictEvenInsideStrictExpectationBlock() { new Expectations() { { a.doSomething(); a.hashCode(); result = 1; a.equals(any); a.toString(); } }; a.doSomething(); } }