diff options
Diffstat (limited to 'tests/com/google/android/testing/mocking/AndroidMockTest.java')
-rw-r--r-- | tests/com/google/android/testing/mocking/AndroidMockTest.java | 927 |
1 files changed, 927 insertions, 0 deletions
diff --git a/tests/com/google/android/testing/mocking/AndroidMockTest.java b/tests/com/google/android/testing/mocking/AndroidMockTest.java new file mode 100644 index 0000000..56fcbb3 --- /dev/null +++ b/tests/com/google/android/testing/mocking/AndroidMockTest.java @@ -0,0 +1,927 @@ +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.google.android.testing.mocking; + +import javassist.CannotCompileException; +import javassist.ClassPool; +import javassist.CtClass; +import javassist.CtMethod; +import javassist.Modifier; +import javassist.NotFoundException; +import javassist.expr.ExprEditor; +import javassist.expr.MethodCall; + +import junit.framework.TestCase; + +import org.easymock.Capture; +import org.easymock.IAnswer; +import org.easymock.LogicalOperator; +import org.easymock.internal.matchers.Equals; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInput; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.SimpleTimeZone; +import java.util.Vector; + + +/** + * Tests for the AndroidMock class. + * + * @author swoodward@google.com (Stephen Woodward) + */ +public class AndroidMockTest extends TestCase { + private List<String> notForwardedMethods = + new ArrayList<String>(Arrays.asList(new String[] { + "com.google.android.testing.mocking.AndroidMock.getInterfaceFor(java.lang.Class)", + "com.google.android.testing.mocking.AndroidMock.getSubclassNameFor(java.lang.Class)", + "com.google.android.testing.mocking.AndroidMock.getSubclassFor(java.lang.Class," + + "java.lang.Class,java.lang.Object)", + "com.google.android.testing.mocking.AndroidMock.getInterfaceNameFor(java.lang.Class)", + "com.google.android.testing.mocking.AndroidMock.createStrictMock(" + + "java.lang.Class,java.lang.Object[])", + "com.google.android.testing.mocking.AndroidMock.createStrictMock(" + + "java.lang.String,java.lang.Class,java.lang.Object[])", + "com.google.android.testing.mocking.AndroidMock.createMock(" + + "java.lang.Class,java.lang.Object[])", + "com.google.android.testing.mocking.AndroidMock.createMock(" + + "java.lang.String,java.lang.Class,java.lang.Object[])", + "com.google.android.testing.mocking.AndroidMock.createNiceMock(" + + "java.lang.Class,java.lang.Object[])", + "com.google.android.testing.mocking.AndroidMock.createNiceMock(" + + "java.lang.String,java.lang.Class,java.lang.Object[])"})); + + private CtMethod[] getForwardedMethods() throws NotFoundException { + List<CtMethod> methods = + new ArrayList<CtMethod>(Arrays.asList(getAndroidMockCtClass().getDeclaredMethods())); + // Get a copy for safe removal of elements during iteration. + for (CtMethod method : Arrays.asList(methods.toArray(new CtMethod[0]))) { + if (notForwardedMethods.contains(method.getLongName()) + || !Modifier.isPublic(method.getModifiers())) { + methods.remove(method); + } + } + return methods.toArray(new CtMethod[0]); + } + + private CtClass getAndroidMockCtClass() throws NotFoundException { + return ClassPool.getDefault().get("com.google.android.testing.mocking.AndroidMock"); + } + + private void compileClasses(List<GeneratedClassFile> mockClasses) throws NotFoundException { + for (GeneratedClassFile clazz : mockClasses) { + CtClass ctClass; + ctClass = ClassPool.getDefault().get(clazz.getClassName()); + try { + ctClass.toClass(); + } catch (CannotCompileException e) { + // Just ignore -- this will happen for every class used in more than one test. + } + } + } + + public void testIsUnboxableToPrimitiveAllPrimitives() { + assertTrue(AndroidMock.isUnboxableToPrimitive(Integer.TYPE, new Integer(42), true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Long.TYPE, new Long(42L), true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Short.TYPE, new Short((short) 42), true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Byte.TYPE, new Byte((byte) 42), true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Boolean.TYPE, Boolean.TRUE, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Float.TYPE, new Float(42.0f), true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Double.TYPE, new Double(42.0), true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Character.TYPE, new Character('a'), true)); + + assertTrue(AndroidMock.isUnboxableToPrimitive(Integer.TYPE, 42, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Long.TYPE, 42L, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Short.TYPE, (short) 42, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Byte.TYPE, (byte) 42, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Boolean.TYPE, true, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Float.TYPE, 42.0f, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Double.TYPE, 42.0, true)); + assertTrue(AndroidMock.isUnboxableToPrimitive(Character.TYPE, 'a', true)); + } + + public void testIsUnboxableToPrimitiveIsObject() { + assertFalse(AndroidMock.isUnboxableToPrimitive(Integer.TYPE, new Object(), false)); + } + + public void testIsUnboxableToPrimitiveAllWideningPrimitives() { + Object[] testValues = + new Object[] {new Byte((byte) 42), new Short((short) 42), new Integer(42), new Long(42L), + new Float(42.0f), new Double(42.0), new Character('a'), Boolean.TRUE}; + boolean[] byteExpected = new boolean[] {true, false, false, false, false, false, false, false}; + boolean[] shortExpected = new boolean[] {true, true, false, false, false, false, true, false}; + boolean[] intExpected = new boolean[] {true, true, true, false, false, false, true, false}; + boolean[] longExpected = new boolean[] {true, true, true, true, false, false, true, false}; + boolean[] floatExpected = new boolean[] {true, true, true, false, true, false, true, false}; + boolean[] doubleExpected = new boolean[] {true, true, true, true, true, true, true, false}; + boolean[] charExpected = new boolean[] {true, true, true, false, false, false, true, false}; + boolean[] booleanExpected = + new boolean[] {false, false, false, false, false, false, false, true}; + + for (int i = 0; i < testValues.length; ++i) { + assertEquals("Convert byte from " + testValues[i].getClass(), byteExpected[i], AndroidMock + .isUnboxableToPrimitive(Byte.TYPE, testValues[i], false)); + assertEquals("Convert short from " + testValues[i].getClass(), shortExpected[i], AndroidMock + .isUnboxableToPrimitive(Short.TYPE, testValues[i], false)); + assertEquals("Convert int from " + testValues[i].getClass(), intExpected[i], AndroidMock + .isUnboxableToPrimitive(Integer.TYPE, testValues[i], false)); + assertEquals("Convert long from " + testValues[i].getClass(), longExpected[i], AndroidMock + .isUnboxableToPrimitive(Long.TYPE, testValues[i], false)); + assertEquals("Convert float from " + testValues[i].getClass(), floatExpected[i], AndroidMock + .isUnboxableToPrimitive(Float.TYPE, testValues[i], false)); + assertEquals("Convert double from " + testValues[i].getClass(), doubleExpected[i], + AndroidMock.isUnboxableToPrimitive(Double.TYPE, testValues[i], false)); + assertEquals("Convert char from " + testValues[i].getClass(), charExpected[i], AndroidMock + .isUnboxableToPrimitive(Character.TYPE, testValues[i], false)); + assertEquals("Convert boolean from " + testValues[i].getClass(), booleanExpected[i], + AndroidMock.isUnboxableToPrimitive(Boolean.TYPE, testValues[i], false)); + } + } + + + public void testIsUnboxableToPrimitiveNotPrimitive() { + try { + AndroidMock.isUnboxableToPrimitive(Object.class, Object.class, false); + fail("Exception should have been thrown"); + } catch (IllegalArgumentException e) { + // expected + } + } + + public void testCreateMock() throws ClassNotFoundException, IOException, CannotCompileException, + NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<String> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.expect(mockVector.get(0)).andReturn("Hello World"); + AndroidMock.replay(mockVector); + assertEquals("Hello World", mockVector.get(0).toString()); + AndroidMock.verify(mockVector); + } + + public void testCreateMockUsingParameters() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + compileClasses(mockClasses); + SimpleTimeZone mockTimeZone = AndroidMock.createMock(SimpleTimeZone.class, 0, "GMT"); + AndroidMock.expect(mockTimeZone.getRawOffset()).andReturn(42); + AndroidMock.replay(mockTimeZone); + assertEquals(42, mockTimeZone.getRawOffset()); + AndroidMock.verify(mockTimeZone); + } + + public void testCreateMockUsingProtectedConstructors() throws ClassNotFoundException, + IOException, CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Calendar.class); + compileClasses(mockClasses); + Calendar mockCalendar = AndroidMock.createMock(Calendar.class); + AndroidMock.expect(mockCalendar.getGreatestMinimum(1)).andReturn(42); + AndroidMock.replay(mockCalendar); + assertEquals(42, mockCalendar.getGreatestMinimum(1)); + AndroidMock.verify(mockCalendar); + + // Just don't explode + Calendar newMockCalendar = + AndroidMock.createMock(Calendar.class, new SimpleTimeZone(1, "GMT"), Locale.UK); + } + + public void testCreateMockUsingCastableParameters() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + compileClasses(mockClasses); + SimpleTimeZone mockTimeZone = AndroidMock.createMock(SimpleTimeZone.class, 'a', "GMT"); + AndroidMock.expect(mockTimeZone.getRawOffset()).andReturn(42); + AndroidMock.replay(mockTimeZone); + assertEquals(42, mockTimeZone.getRawOffset()); + AndroidMock.verify(mockTimeZone); + } + + public void testCreateMockUsingUnusableParameters() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + compileClasses(mockClasses); + try { + SimpleTimeZone mockTimeZone = AndroidMock.createMock(SimpleTimeZone.class, "GMT"); + fail("Excepted an IllegalArgumentException for incorrect number of constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + try { + SimpleTimeZone mockTimeZone = AndroidMock.createMock(SimpleTimeZone.class, 0, null); + fail("Excepted an IllegalArgumentException for indeterminate null constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + try { + SimpleTimeZone mockTimeZone = AndroidMock.createMock(SimpleTimeZone.class, 0, new Object()); + fail("Excepted an IllegalArgumentException for incorrect constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + } + + public void testCreateMockUsingInterface() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Map.class); + compileClasses(mockClasses); + Map<String, String> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get("key")).andReturn("Hello World"); + AndroidMock.replay(mockMap); + assertEquals("Hello World", mockMap.get("key")); + AndroidMock.verify(mockMap); + } + + public void testCreateMockUsingClass() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<String> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.expect(mockVector.get(0)).andReturn("Hello World"); + AndroidMock.replay(mockVector); + assertEquals("Hello World", mockVector.get(0).toString()); + AndroidMock.verify(mockVector); + } + + public void testCreateNiceMock() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<String> mockVector = AndroidMock.createNiceMock(Vector.class); + AndroidMock.expect(mockVector.get(0)).andReturn("Hello World"); + AndroidMock.replay(mockVector); + assertEquals("Hello World", mockVector.get(0).toString()); + AndroidMock.verify(mockVector); + } + + public void testCreateNiceMockUsingUnusableParameters() throws ClassNotFoundException, + IOException, CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + compileClasses(mockClasses); + try { + SimpleTimeZone mockTimeZone = AndroidMock.createNiceMock(SimpleTimeZone.class, "GMT"); + fail("Excepted an IllegalArgumentException for incorrect number of constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + try { + SimpleTimeZone mockTimeZone = AndroidMock.createNiceMock(SimpleTimeZone.class, 0, null); + fail("Excepted an IllegalArgumentException for indeterminate null constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + try { + SimpleTimeZone mockTimeZone = + AndroidMock.createNiceMock(SimpleTimeZone.class, 0, new Object()); + fail("Excepted an IllegalArgumentException for incorrect constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + } + + public void testCreateNiceMockUsingParameters() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + + compileClasses(mockClasses); + SimpleTimeZone mockTimeZone = AndroidMock.createNiceMock(SimpleTimeZone.class, 0, "GMT"); + AndroidMock.expect(mockTimeZone.getRawOffset()).andReturn(42); + AndroidMock.replay(mockTimeZone); + assertEquals(42, mockTimeZone.getRawOffset()); + AndroidMock.verify(mockTimeZone); + } + + public void testCreateNiceMockUsingCastableParameters() throws ClassNotFoundException, + IOException, CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + + compileClasses(mockClasses); + SimpleTimeZone mockTimeZone = AndroidMock.createNiceMock(SimpleTimeZone.class, 'a', "GMT"); + AndroidMock.expect(mockTimeZone.getRawOffset()).andReturn(42); + AndroidMock.replay(mockTimeZone); + assertEquals(42, mockTimeZone.getRawOffset()); + AndroidMock.verify(mockTimeZone); + } + + public void testCreateNiceMockUsingInterface() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Map.class); + + compileClasses(mockClasses); + Map<String, String> mockMap = AndroidMock.createNiceMock(Map.class); + AndroidMock.expect(mockMap.get("key")).andReturn("Hello World"); + AndroidMock.replay(mockMap); + assertEquals("Hello World", mockMap.get("key")); + AndroidMock.verify(mockMap); + } + + public void testCreateNiceMockUsingClass() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + + compileClasses(mockClasses); + Vector<String> mockVector = AndroidMock.createNiceMock(Vector.class); + AndroidMock.expect(mockVector.get(0)).andReturn("Hello World"); + AndroidMock.replay(mockVector); + assertEquals("Hello World", mockVector.get(0).toString()); + AndroidMock.verify(mockVector); + } + + public void testCreateStrictMock() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + + compileClasses(mockClasses); + Vector<String> mockVector = AndroidMock.createStrictMock(Vector.class); + AndroidMock.expect(mockVector.get(0)).andReturn("Hello World"); + AndroidMock.replay(mockVector); + assertEquals("Hello World", mockVector.get(0).toString()); + AndroidMock.verify(mockVector); + } + + public void testCreateStrictMockUsingUnusableParameters() throws ClassNotFoundException, + IOException, CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + + compileClasses(mockClasses); + try { + SimpleTimeZone mockTimeZone = AndroidMock.createStrictMock(SimpleTimeZone.class, "GMT"); + fail("Excepted an IllegalArgumentException for incorrect number of constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + try { + SimpleTimeZone mockTimeZone = AndroidMock.createStrictMock(SimpleTimeZone.class, 0, null); + fail("Excepted an IllegalArgumentException for indeterminate null constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + try { + SimpleTimeZone mockTimeZone = + AndroidMock.createStrictMock(SimpleTimeZone.class, 0, new Object()); + fail("Excepted an IllegalArgumentException for incorrect constructor parameters"); + } catch (IllegalArgumentException e) { + // Expected + } + } + + public void testCreateStrictMockUsingParameters() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + + compileClasses(mockClasses); + SimpleTimeZone mockTimeZone = AndroidMock.createStrictMock(SimpleTimeZone.class, 0, "GMT"); + AndroidMock.expect(mockTimeZone.getRawOffset()).andReturn(42); + AndroidMock.replay(mockTimeZone); + assertEquals(42, mockTimeZone.getRawOffset()); + AndroidMock.verify(mockTimeZone); + } + + public void testCreateStrictMockUsingCastableParameters() throws ClassNotFoundException, + IOException, CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(SimpleTimeZone.class); + + compileClasses(mockClasses); + SimpleTimeZone mockTimeZone = AndroidMock.createStrictMock(SimpleTimeZone.class, 'a', "GMT"); + AndroidMock.expect(mockTimeZone.getRawOffset()).andReturn(42); + AndroidMock.replay(mockTimeZone); + assertEquals(42, mockTimeZone.getRawOffset()); + AndroidMock.verify(mockTimeZone); + } + + public void testCreateStrictMockUsingInterface() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Map.class); + + compileClasses(mockClasses); + Map<String, String> mockMap = AndroidMock.createStrictMock(Map.class); + AndroidMock.expect(mockMap.get("key")).andReturn("Hello World"); + AndroidMock.replay(mockMap); + assertEquals("Hello World", mockMap.get("key")); + AndroidMock.verify(mockMap); + } + + public void testCreateStrictMockUsingClass() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<String> mockVector = AndroidMock.createStrictMock(Vector.class); + AndroidMock.expect(mockVector.get(0)).andReturn("Hello World"); + AndroidMock.replay(mockVector); + assertEquals("Hello World", mockVector.get(0).toString()); + AndroidMock.verify(mockVector); + } + + public void testCreateMockConstructorDoesWorkOnAllReturnTypes() throws ClassNotFoundException, + IOException, CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(ClassDoesWorkInConstructor.class); + compileClasses(mockClasses); + ClassDoesWorkInConstructor mock = AndroidMock.createMock(ClassDoesWorkInConstructor.class); + } + + public void testAllForwardedMethods() throws CannotCompileException, NotFoundException { + for (CtMethod method : getForwardedMethods()) { + MethodVerifier verifier = new MethodVerifier(method); + // CtMethod.instrument Causes every instruction in the method to be + // inspected, and passed to + // the MethodVerifier callback (extends javassist.expr.ExprEditor). We + // want to verify that + // the expected EasyMock method is called at least once in each + // AndroidMock method. + method.instrument(verifier); + assertTrue(method.getLongName() + " not called.", verifier.expectedMethodCalled()); + } + } + + public void testCheckOrder() throws ClassNotFoundException, IOException, CannotCompileException, + NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.checkOrder(mockVector, false); + AndroidMock.checkOrder(AndroidMock.createMock(Map.class), false); + } + + public void testVerify() throws ClassNotFoundException, IOException, CannotCompileException, + NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.replay(mockVector); + AndroidMock.verify(mockVector); + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.replay(mockMap); + AndroidMock.verify(mockMap); + } + + public void testResetToStrict() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.resetToStrict(mockVector); + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.resetToStrict(mockMap); + } + + public void testResetToDefault() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.resetToDefault(mockVector); + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.resetToDefault(mockMap); + } + + public void testResetToNice() throws ClassNotFoundException, IOException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.resetToNice(mockVector); + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.resetToNice(mockMap); + } + + public void testReset() throws ClassNotFoundException, IOException, CannotCompileException, + NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.reset(mockVector); + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.reset(mockMap); + + } + + public void testReplay() throws ClassNotFoundException, IOException, CannotCompileException, + NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(Vector.class); + compileClasses(mockClasses); + Vector<?> mockVector = AndroidMock.createMock(Vector.class); + AndroidMock.replay(mockVector); + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.replay(mockMap); + } + + public void testExpect() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + mockMap.clear(); + AndroidMock.expect(null); + AndroidMock.replay(mockMap); + } + + public void testExpectLastCall() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + mockMap.clear(); + AndroidMock.expectLastCall(); + AndroidMock.replay(mockMap); + } + + public void testAnyBoolean() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyBoolean())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyByte() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyByte())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyChar() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyChar())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyInt() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyInt())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyLong() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyLong())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyFloat() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyFloat())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyDouble() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyDouble())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyShort() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyShort())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnyObject() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.anyObject())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testGeq() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.geq((byte) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.geq((short) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.geq(0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.geq(0L))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.geq(0.0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.geq(0.0f))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.geq("Hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testLeq() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.leq((byte) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.leq((short) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.leq(0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.leq(0L))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.leq(0.0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.leq(0.0f))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.leq("Hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testGt() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.gt((byte) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.gt((short) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.gt(0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.gt(0L))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.gt(0.0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.gt(0.0f))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.gt("Hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testLt() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.lt((byte) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.lt((short) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.lt(0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.lt(0L))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.lt(0.0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.lt(0.0f))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.lt("Hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testIsA() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.isA(String.class))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testContains() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.contains("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAnd() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq(true), AndroidMock.eq(true)))) + .andReturn(null); + AndroidMock.expect( + mockMap.get(AndroidMock.and(AndroidMock.eq((byte) 0), AndroidMock.eq((byte) 0)))) + .andReturn(null); + AndroidMock.expect( + mockMap.get(AndroidMock.and(AndroidMock.eq((short) 0), AndroidMock.eq((short) 0)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq(0), AndroidMock.eq(0)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq(0L), AndroidMock.eq(0L)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq(0.0), AndroidMock.eq(0.0)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq(0.0f), AndroidMock.eq(0.0f)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq("hi"), AndroidMock.eq("hi")))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.and(AndroidMock.eq('a'), AndroidMock.eq('a')))) + .andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testOr() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq(true), AndroidMock.eq(true)))) + .andReturn(null); + AndroidMock.expect( + mockMap.get(AndroidMock.or(AndroidMock.eq((byte) 0), AndroidMock.eq((byte) 0)))) + .andReturn(null); + AndroidMock.expect( + mockMap.get(AndroidMock.or(AndroidMock.eq((short) 0), AndroidMock.eq((short) 0)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq(0), AndroidMock.eq(0)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq(0L), AndroidMock.eq(0L)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq(0.0), AndroidMock.eq(0.0)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq(0.0f), AndroidMock.eq(0.0f)))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq("hi"), AndroidMock.eq("hi")))) + .andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.or(AndroidMock.eq('a'), AndroidMock.eq('a')))) + .andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testNot() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq(true)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq((byte) 0)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq((short) 0)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq(0)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq(0L)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq(0.0)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq(0.0f)))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq("hi")))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.not(AndroidMock.eq('a')))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testEq() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.eq(true))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq((byte) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq((short) 0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq(0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq(0L))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq(0.0))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq(0.0f))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq(0.0, 0.1))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq(0.0f, 0.1f))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq("hi"))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.eq('a'))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testAryEq() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new boolean[] {true}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new byte[] {(byte) 0}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new short[] {(short) 0}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new int[] {0}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new long[] {0L}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new double[] {0.0}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new float[] {0.0f}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new String[] {"hi"}))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.aryEq(new char[] {'a'}))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testIsNull() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.isNull())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testNotNull() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.notNull())).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testFind() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.find("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testMatches() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.matches("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testStartsWith() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.startsWith("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testEndsWith() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.endsWith("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testSame() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.same("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testCmpEq() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.cmpEq("hi"))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testCmp() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect( + mockMap.get(AndroidMock.cmp("hi", String.CASE_INSENSITIVE_ORDER, LogicalOperator.EQUAL))) + .andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testCapture() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<Byte>()))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<Character>()))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<Double>()))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<Float>()))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<Integer>()))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<Long>()))).andReturn(null); + AndroidMock.expect(mockMap.get(AndroidMock.capture(new Capture<String>()))).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testReportMatcher() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.reportMatcher(new Equals(null)); + AndroidMock.expect(mockMap.get(null)).andReturn(null); + AndroidMock.replay(mockMap); + } + + public void testGetCurrentArguments() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.expect(mockMap.get(null)).andAnswer(new IAnswer() { + @Override + public Object answer() { + AndroidMock.getCurrentArguments(); + return null; + } + }); + AndroidMock.replay(mockMap); + mockMap.get(null); + } + + public void testMakeThreadSafe() { + Map<?, ?> mockMap = AndroidMock.createMock(Map.class); + AndroidMock.makeThreadSafe(mockMap, false); + AndroidMock.replay(mockMap); + } + + public void testAndThrowsOnMockedInterface() throws IOException { + ObjectInput mockInStream = AndroidMock.createMock(ObjectInput.class); + AndroidMock.expect(mockInStream.read()).andThrow(new IOException("foo")); + AndroidMock.replay(mockInStream); + try { + mockInStream.read(); + fail("IOException not thrown"); + } catch (IOException e) { + assertEquals("foo", e.getMessage()); + } + AndroidMock.verify(mockInStream); + } + + public void testAndThrowsOnMockedClass() throws IOException, ClassNotFoundException, + CannotCompileException, NotFoundException { + List<GeneratedClassFile> mockClasses = + new AndroidMockGenerator().createMocksForClass(InputStream.class); + compileClasses(mockClasses); + InputStream mockInStream = AndroidMock.createMock(InputStream.class); + AndroidMock.expect(mockInStream.read()).andThrow(new IOException("foo")); + AndroidMock.replay(mockInStream); + try { + mockInStream.read(); + fail("IOException not thrown"); + } catch (IOException e) { + assertEquals("foo", e.getMessage()); + } + AndroidMock.verify(mockInStream); + } + + /** + * Used for testing that a given method on Android Mock calls the equivalent + * method on EasyMock, to ensure that the method-wiring of Android Mock is + * correct. + * + * @author swoodward@google.com (Stephen Woodward) + */ + class MethodVerifier extends ExprEditor { + private CtMethod expectedMethod; + private boolean methodCalled; + + MethodVerifier(CtMethod expectedMethod) { + this.expectedMethod = expectedMethod; + } + + @Override + public void edit(MethodCall calledMethod) { + try { + methodCalled = methodCalled || expectedMethod.equals(calledMethod.getMethod()); + } catch (NotFoundException e) { + throw new RuntimeException(e); + } + } + + public boolean expectedMethodCalled() { + return methodCalled; + } + } +} |