/* * Copyright (c) 2006-2011 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit; import java.util.*; import static mockit.Deencapsulation.*; import static org.junit.Assert.*; import org.junit.*; import mockit.internal.util.*; @SuppressWarnings({"UnusedDeclaration", "ClassWithTooManyMethods"}) public final class DeencapsulationTest { static final Class<?> innerClass = Utilities.loadClass("mockit.Subclass$InnerClass"); final Subclass anInstance = new Subclass(); @Test public void setValueOfNonConstantFinalField() { Subclass obj = new Subclass(); setField(obj, "INITIAL_VALUE", 123); assertEquals(123, obj.INITIAL_VALUE); } @Test public void getInstanceFieldByName() { anInstance.setIntField(3); anInstance.setStringField("test"); anInstance.setListField(Collections.<String>emptyList()); Integer intValue = getField(anInstance, "intField"); String stringValue = getField(anInstance, "stringField"); List<String> listValue = getField(anInstance, "listField"); assertEquals(anInstance.getIntField(), intValue.intValue()); assertEquals(anInstance.getStringField(), stringValue); assertSame(anInstance.getListField(), listValue); } @Test(expected = IllegalArgumentException.class) public void attemptToGetInstanceFieldByNameWithWrongName() { getField(anInstance, "noField"); } @Test public void getInheritedInstanceFieldByName() { anInstance.baseInt = 3; anInstance.baseString = "test"; anInstance.baseSet = Collections.emptySet(); Integer intValue = getField(anInstance, "baseInt"); String stringValue = getField(anInstance, "baseString"); Set<Boolean> listValue = getField(anInstance, "baseSet"); assertEquals(anInstance.baseInt, intValue.intValue()); assertEquals(anInstance.baseString, stringValue); assertSame(anInstance.baseSet, listValue); } @SuppressWarnings({"unchecked"}) @Test public void getInstanceFieldByType() { anInstance.setStringField("by type"); anInstance.setListField(new ArrayList<String>()); String stringValue = getField(anInstance, String.class); List<String> listValue = getField(anInstance, List.class); List<String> listValue2 = getField(anInstance, ArrayList.class); assertEquals(anInstance.getStringField(), stringValue); assertSame(anInstance.getListField(), listValue); assertSame(listValue, listValue2); } @Test(expected = IllegalArgumentException.class) public void attemptToGetInstanceFieldByTypeWithWrongType() { getField(anInstance, Byte.class); } @Test(expected = IllegalArgumentException.class) public void attemptToGetInstanceFieldByTypeForClassWithMultipleFieldsOfThatType() { getField(anInstance, int.class); } @SuppressWarnings({"unchecked"}) @Test public void getInheritedInstanceFieldByType() { Set<Boolean> fieldValueOnInstance = new HashSet<Boolean>(); anInstance.baseSet = fieldValueOnInstance; Set<Boolean> setValue = getField(anInstance, fieldValueOnInstance.getClass()); Set<Boolean> setValue2 = getField(anInstance, HashSet.class); assertSame(fieldValueOnInstance, setValue); assertSame(setValue, setValue2); } @Test public void getInstanceFieldOnBaseClassByType() { anInstance.setLongField(15); long longValue = getField(anInstance, long.class); assertEquals(15, longValue); } @Test public void getStaticFieldByName() { Subclass.setBuffer(new StringBuilder()); StringBuilder b = getField(Subclass.class, "buffer"); assertSame(Subclass.getBuffer(), b); } @Test(expected = IllegalArgumentException.class) public void attemptToGetStaticFieldByNameFromWrongClass() { getField(BaseClass.class, "buffer"); } @Test public void getStaticFieldByType() { Subclass.setBuffer(new StringBuilder()); StringBuilder b = getField(Subclass.class, StringBuilder.class); assertSame(Subclass.getBuffer(), b); } @Test public void setInstanceFieldByName() { anInstance.setIntField2(1); setField(anInstance, "intField2", 901); assertEquals(901, anInstance.getIntField2()); } @Test(expected = IllegalArgumentException.class) public void attemptToSetInstanceFieldByNameWithWrongName() { setField(anInstance, "noField", 901); } @Test public void setInstanceFieldByType() { anInstance.setStringField(""); setField(anInstance, "Test"); assertEquals("Test", anInstance.getStringField()); } @Test(expected = IllegalArgumentException.class) public void attemptToSetInstanceFieldByTypeWithWrongType() { setField(anInstance, (byte) 123); } @Test(expected = IllegalArgumentException.class) public void attemptToSetInstanceFieldByTypeForClassWithMultipleFieldsOfThatType() { setField(anInstance, 901); } @Test public void setStaticFieldByName() { Subclass.setBuffer(null); setField(Subclass.class, "buffer", new StringBuilder()); assertNotNull(Subclass.getBuffer()); } @Test(expected = IllegalArgumentException.class) public void attemptToSetStaticFieldByNameWithWrongName() { setField(Subclass.class, "noField", null); } @Test public void setStaticFieldByType() { Subclass.setBuffer(null); setField(Subclass.class, new StringBuilder()); assertNotNull(Subclass.getBuffer()); } @Test(expected = IllegalArgumentException.class) public void attemptToSetStaticFieldByTypeWithWrongType() { setField(Subclass.class, new StringBuffer()); } @Test(expected = IllegalArgumentException.class) public void attemptToSetStaticFieldByTypeForClassWithMultipleFieldsOfThatType() { setField(Subclass.class, 'A'); } @Test public void invokeInstanceMethodWithoutParameters() { Long result = invoke(anInstance, "aMethod"); assertEquals(567L, result.longValue()); } @Test public void invokeInstanceMethodWithMultipleParameters() { assertNull(invoke(anInstance, "instanceMethod", (short) 7, "abc", true)); String result = invoke(anInstance, "instanceMethod", (short) 7, new StringBuilder("abc"), true); assertEquals("abc", result); } @Test public void invokeInstanceMethodWithNullArgumentsSpecifiedThroughClassLiterals() { assertNull(invoke(anInstance, "instanceMethod", (short) 7, String.class, Boolean.class)); String result = invoke(anInstance, "instanceMethod", (short) 7, StringBuilder.class, true); assertEquals("null", result); } @Test(expected = IllegalArgumentException.class) public void invokeInstanceMethodWithInvalidNullArgument() { invoke(anInstance, "instanceMethod", (short) 7, null, true); } @Test public void invokeInstanceMethodWithSingleParameterOfBaseTypeWhilePassingSubtypeInstance() { invoke(anInstance, "setListField", new ArrayList<String>()); } @Test public void invokeStaticMethodWithoutParameters() { Boolean result = invoke(Subclass.class, "anStaticMethod"); assertTrue(result); } @Test public void invokeStaticMethodByClassNameWithoutParameters() { Boolean result = invoke(Subclass.class.getName(), "anStaticMethod"); assertTrue(result); } @Test public void invokeStaticMethodWithMultipleParameters() { assertNull(invoke(Subclass.class, "staticMethod", (short) 7, "abc", true)); String result = invoke(Subclass.class, "staticMethod", (short) 7, new StringBuilder("abc"), true); assertEquals("abc", result); } @Test public void invokeStaticMethodByClassNameWithMultipleParameters() { Object result = invoke(Subclass.class.getName(), "staticMethod", (short) 7, "abc", true); assertNull(result); } @Test(expected = IllegalArgumentException.class) public void invokeMethodByClassNameOnUnavailableClass() { invoke("abc.xyz.NoClass", "aMethod"); } @Test public void invokeStaticMethodWithNullArgumentsSpecifiedThroughClassLiterals() { assertNull(invoke(anInstance, "staticMethod", (short) 7, String.class, Boolean.class)); String result = invoke(anInstance, "staticMethod", (short) 7, StringBuilder.class, true); assertEquals("null", result); } @Test(expected = IllegalArgumentException.class) public void invokeStaticMethodWithInvalidNullArgument() { invoke(anInstance, "staticMethod", (short) 7, null, true); } @Test(expected = IllegalArgumentException.class) public void invokeInstanceMethodAsAnStaticMethod() { invoke(anInstance.getClass(), "instanceMethod", (short) 7, "test", true); } @Test(expected = IllegalArgumentException.class) public void invokeInstanceMethodAsAnStaticMethodUsingClassName() { invoke(anInstance.getClass().getName(), "instanceMethod", (short) 7, "test", true); } @Test public void newInstanceUsingNoArgsConstructorFromSpecifiedParameterTypes() { Subclass instance = newInstance(Subclass.class.getName(), new Class<?>[] {}); assertNotNull(instance); assertEquals(-1, instance.getIntField()); } @Test public void newInstanceUsingNoArgsConstructorWithoutSpecifyingParameters() { Subclass instance = newInstance(Subclass.class.getName()); assertNotNull(instance); assertEquals(-1, instance.getIntField()); } @Test public void newInstanceByNameUsingMultipleArgsConstructorFromSpecifiedParameterTypes() { Subclass instance = newInstance(Subclass.class.getName(), new Class<?>[] {int.class, String.class}, 1, "XYZ"); assertNotNull(instance); assertEquals(1, instance.getIntField()); assertEquals("XYZ", instance.getStringField()); } @Test public void newInstanceUsingMultipleArgsConstructorFromSpecifiedParameterTypes() { BaseClass instance = newInstance(Subclass.class, new Class<?>[] {int.class, String.class}, 1, "XYZ"); assertNotNull(instance); } @Test(expected = IllegalArgumentException.class) public void attemptNewInstanceWithNoMatchingConstructor() { newInstance(Subclass.class.getName(), new Class<?>[] {char.class}, 'z'); } @Test public void newInstanceByNameUsingMultipleArgsConstructorFromNonNullArgumentValues() { Subclass instance = newInstance(Subclass.class.getName(), 590, ""); assertNotNull(instance); assertEquals(590, instance.getIntField()); assertEquals("", instance.getStringField()); } @Test(expected = IllegalArgumentException.class) public void newInstanceByNameUsingMultipleArgsConstructorWithInvalidNullArgument() { newInstance(Subclass.class.getName(), 590, null); } @Test public void newInstancePassingSubclassInstanceToConstructorWithSingleArgument() { List<String> aList = new ArrayList<String>(); Subclass instance = newInstance(Subclass.class, aList); assertNotNull(instance); assertSame(aList, instance.getListField()); } @Test public void newInstanceUsingMultipleArgsConstructorFromNonNullArgumentValues() { BaseClass instance = newInstance(Subclass.class, 590, ""); assertNotNull(instance); } @Test public void newInnerInstanceUsingNoArgsConstructor() { Object innerInstance = newInnerInstance("InnerClass", anInstance); assertTrue(innerClass.isInstance(innerInstance)); } @Test(expected = IllegalArgumentException.class) public void newInnerInstanceWithWrongInnerClassName() { newInnerInstance("NoClass", anInstance); } @Test public void newInnerInstanceByNameUsingMultipleArgsConstructor() { Object innerInstance = newInnerInstance("InnerClass", anInstance, true, 5L, ""); assertTrue(innerClass.isInstance(innerInstance)); } @Test(expected = IllegalArgumentException.class) public void newInnerInstanceByNameUsingMultipleArgsConstructorWithInvalidNullArguments() { newInnerInstance("InnerClass", anInstance, false, null, null); } @Test public void newInnerInstanceUsingMultipleArgsConstructor() { Object innerInstance = newInnerInstance(innerClass, anInstance, true, 5L, ""); assertTrue(innerClass.isInstance(innerInstance)); } @Test public void newInnerInstancePassingSubclassInstanceToConstructorWithSingleArgument() { List<String> aList = new ArrayList<String>(); Object innerInstance = newInnerInstance(innerClass, anInstance, aList); assertTrue(innerClass.isInstance(innerInstance)); } }