• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2010 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 package com.google.android.testing.mocking;
17 
18 import javassist.CannotCompileException;
19 import javassist.ClassPool;
20 import javassist.CtClass;
21 import javassist.CtMethod;
22 import javassist.NotFoundException;
23 
24 import junit.framework.TestCase;
25 
26 import java.io.IOException;
27 import java.lang.reflect.Method;
28 import java.math.BigInteger;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.List;
32 
33 
34 /**
35  * Tests for the AndroidMockGenerator class.
36  *
37  * @author swoodward@google.com (Stephen Woodward)
38  */
39 public class AndroidMockGeneratorTest extends TestCase {
getAndroidMockGenerator()40   private AndroidMockGenerator getAndroidMockGenerator() {
41     return new AndroidMockGenerator();
42   }
43 
getNoFileMockGenerator()44   private NoFileAndroidMockGenerator getNoFileMockGenerator() {
45     return new NoFileAndroidMockGenerator();
46   }
47 
cleanupGeneratedClasses(CtClass... classes)48   private void cleanupGeneratedClasses(CtClass... classes) {
49     for (CtClass clazz : classes) {
50       clazz.detach();
51     }
52   }
53 
assertUnorderedContentsSame(Iterable<T> expected, Iterable<T> actual)54   private <T> void assertUnorderedContentsSame(Iterable<T> expected, Iterable<T> actual) {
55     List<T> missingItems = new ArrayList<T>();
56     List<T> extraItems = new ArrayList<T>();
57     for (T item : expected) {
58       missingItems.add(item);
59     }
60     for (T item : actual) {
61       missingItems.remove(item);
62       extraItems.add(item);
63     }
64     for (T item : expected) {
65       extraItems.remove(item);
66     }
67     if (missingItems.size() + extraItems.size() != 0) {
68       String errorMessage =
69           "Contents were different. Missing: " + Arrays.toString(missingItems.toArray())
70               + " Extra: " + Arrays.toString(extraItems.toArray());
71       fail(errorMessage);
72     }
73   }
74 
getExpectedNamesForNumberClass()75   private List<String> getExpectedNamesForNumberClass() {
76     return getExpectedNamesForNumberClass(false);
77   }
78 
getExpectedNamesForObjectClass()79   private List<String> getExpectedNamesForObjectClass() {
80     List<String> expectedNames = new ArrayList<String>();
81     expectedNames.addAll(Arrays.asList(new String[] {"clone", "finalize"}));
82     return expectedNames;
83   }
84 
getExpectedNamesForNumberClass(boolean includeDelegateMethods)85   private List<String> getExpectedNamesForNumberClass(boolean includeDelegateMethods) {
86     List<String> expectedNames = getExpectedNamesForObjectClass();
87     expectedNames.addAll(Arrays.asList(new String[] {"byteValue", "doubleValue", "floatValue",
88         "intValue", "longValue", "shortValue"}));
89     if (includeDelegateMethods) {
90       expectedNames.addAll(Arrays.asList(new String[] {"getDelegate___AndroidMock",
91           "setDelegate___AndroidMock"}));
92     }
93     return expectedNames;
94   }
95 
getExpectedNamesForBigIntegerClass()96   private List<String> getExpectedNamesForBigIntegerClass() {
97     List<String> expectedNames = getExpectedNamesForNumberClass();
98     expectedNames.addAll(Arrays.asList(new String[] {"abs", "add", "and", "andNot", "bitCount",
99         "bitLength", "clearBit", "compareTo", "divide", "divideAndRemainder", "flipBit", "gcd",
100         "getLowestSetBit", "isProbablePrime", "max", "min", "mod", "modInverse", "modPow",
101         "multiply", "negate", "nextProbablePrime", "not", "or", "pow", "remainder", "setBit",
102         "shiftLeft", "shiftRight", "signum", "subtract", "testBit", "toByteArray", "toString",
103         "xor"}));
104     return expectedNames;
105   }
106 
getMethodNames(CtMethod[] methods)107   private List<String> getMethodNames(CtMethod[] methods) {
108     List<String> methodNames = new ArrayList<String>();
109     for (CtMethod method : methods) {
110       methodNames.add(method.getName());
111     }
112     return methodNames;
113   }
114 
getClassNames(List<GeneratedClassFile> classes)115   private List<String> getClassNames(List<GeneratedClassFile> classes) {
116     List<String> classNames = new ArrayList<String>();
117     for (GeneratedClassFile clazz : classes) {
118       classNames.add(clazz.getClassName());
119     }
120     return classNames;
121   }
122 
getExpectedSignaturesForBigIntegerClass()123   private List<String> getExpectedSignaturesForBigIntegerClass() {
124     List<String> expectedNames = new ArrayList<String>();
125     expectedNames.addAll(Arrays.asList(new String[] {
126         "public int java.math.BigInteger.getLowestSetBit()",
127         "public java.math.BigInteger java.math.BigInteger.abs()",
128         "protected void java.lang.Object.finalize() throws java.lang.Throwable",
129         "public java.math.BigInteger java.math.BigInteger.modPow(java.math.BigInteger,"
130             + "java.math.BigInteger)",
131         "protected native java.lang.Object java.lang.Object.clone() throws "
132             + "java.lang.CloneNotSupportedException",
133         "public java.math.BigInteger java.math.BigInteger.setBit(int)",
134         "public java.math.BigInteger java.math.BigInteger.shiftRight(int)",
135         "public int java.math.BigInteger.bitLength()",
136         "public java.math.BigInteger java.math.BigInteger.not()",
137         "public java.math.BigInteger java.math.BigInteger.subtract(java.math.BigInteger)",
138         "public java.math.BigInteger java.math.BigInteger.flipBit(int)",
139         "public boolean java.math.BigInteger.isProbablePrime(int)",
140         "public java.math.BigInteger java.math.BigInteger.add(java.math.BigInteger)",
141         "public java.math.BigInteger java.math.BigInteger.modInverse(java.math.BigInteger)",
142         "public java.math.BigInteger java.math.BigInteger.clearBit(int)",
143         "public java.math.BigInteger java.math.BigInteger.multiply(java.math.BigInteger)",
144         "public byte java.lang.Number.byteValue()",
145         "public java.math.BigInteger java.math.BigInteger.gcd(java.math.BigInteger)",
146         "public float java.math.BigInteger.floatValue()",
147         "public java.lang.String java.math.BigInteger.toString(int)",
148         "public java.math.BigInteger java.math.BigInteger.min(java.math.BigInteger)",
149         "public int java.math.BigInteger.intValue()",
150         "public java.math.BigInteger java.math.BigInteger.or(java.math.BigInteger)",
151         "public java.math.BigInteger java.math.BigInteger.remainder(java.math.BigInteger)",
152         "public java.math.BigInteger java.math.BigInteger.divide(java.math.BigInteger)",
153         "public java.math.BigInteger java.math.BigInteger.xor(java.math.BigInteger)",
154         "public java.math.BigInteger java.math.BigInteger.and(java.math.BigInteger)",
155         "public int java.math.BigInteger.signum()",
156         "public java.math.BigInteger[] java.math.BigInteger.divideAndRemainder("
157             + "java.math.BigInteger)",
158         "public java.math.BigInteger java.math.BigInteger.max(java.math.BigInteger)",
159         "public java.math.BigInteger java.math.BigInteger.shiftLeft(int)",
160         "public double java.math.BigInteger.doubleValue()",
161         "public java.math.BigInteger java.math.BigInteger.pow(int)",
162         "public short java.lang.Number.shortValue()",
163         "public java.math.BigInteger java.math.BigInteger.andNot(java.math.BigInteger)",
164         "public byte[] java.math.BigInteger.toByteArray()",
165         "public java.math.BigInteger java.math.BigInteger.negate()",
166         "public int java.math.BigInteger.compareTo(java.math.BigInteger)",
167         "public boolean java.math.BigInteger.testBit(int)",
168         "public int java.math.BigInteger.bitCount()",
169         "public long java.math.BigInteger.longValue()",
170         "public java.math.BigInteger java.math.BigInteger.mod(java.math.BigInteger)",
171         "public java.math.BigInteger java.math.BigInteger.nextProbablePrime()",
172         }));
173     return expectedNames;
174   }
175 
getMethodSignatures(Method[] methods)176   private List<String> getMethodSignatures(Method[] methods) {
177     List<String> methodSignatures = new ArrayList<String>();
178     for (Method method : methods) {
179       if (getAndroidMockGenerator().isMockable(method)) {
180         methodSignatures.add(method.toGenericString());
181       }
182     }
183     return methodSignatures;
184   }
185 
testIsSupportedType()186   public void testIsSupportedType() {
187     Class<?>[] unsupportedClasses =
188         new Class[] {ClassIsAnnotation.class, ClassIsEnum.class, ClassIsFinal.class,
189             ClassIsInterface.class};
190     Class<?>[] supportedClasses = new Class[] {Object.class};
191 
192     for (Class<?> clazz : unsupportedClasses) {
193       assertFalse(getAndroidMockGenerator().classIsSupportedType(clazz));
194     }
195     for (Class<?> clazz : supportedClasses) {
196       assertTrue(getAndroidMockGenerator().classIsSupportedType(clazz));
197     }
198   }
199 
testGetDelegateFieldName()200   public void testGetDelegateFieldName() {
201     assertEquals("delegateMockObject", getAndroidMockGenerator().getDelegateFieldName());
202   }
203 
testGetInterfaceMethodSource()204   public void testGetInterfaceMethodSource() throws SecurityException, NoSuchMethodException {
205     Method method = Object.class.getMethod("equals", Object.class);
206     assertEquals("public boolean equals(java.lang.Object arg0);", getAndroidMockGenerator()
207         .getInterfaceMethodSource(method));
208   }
209 
testGetInterfaceMethodSourceMultipleExceptions()210   public void testGetInterfaceMethodSourceMultipleExceptions() throws SecurityException,
211       NoSuchMethodException {
212     Method method = Class.class.getDeclaredMethod("newInstance");
213     assertEquals("public java.lang.Object newInstance() throws java.lang.InstantiationException,"
214         + "java.lang.IllegalAccessException;", getAndroidMockGenerator().getInterfaceMethodSource(
215         method));
216   }
217 
testGetInterfaceMethodSourceProtectedMethod()218   public void testGetInterfaceMethodSourceProtectedMethod() throws SecurityException,
219       NoSuchMethodException {
220     Method method = Object.class.getDeclaredMethod("finalize");
221     assertEquals("public void finalize() throws java.lang.Throwable;", getAndroidMockGenerator()
222         .getInterfaceMethodSource(method));
223   }
224 
testGetInterfaceMethodSourceNoParams()225   public void testGetInterfaceMethodSourceNoParams() throws SecurityException,
226       NoSuchMethodException {
227     Method method = Object.class.getMethod("toString");
228     assertEquals("public java.lang.String toString();", getAndroidMockGenerator()
229         .getInterfaceMethodSource(method));
230   }
231 
testGetInterfaceMethodSourceVoidReturn()232   public void testGetInterfaceMethodSourceVoidReturn() throws SecurityException,
233       NoSuchMethodException {
234     Method method = Thread.class.getMethod("run");
235     assertEquals("public void run();", getAndroidMockGenerator().getInterfaceMethodSource(method));
236   }
237 
testGetInterfaceMethodSourceFinal()238   public void testGetInterfaceMethodSourceFinal() throws SecurityException, NoSuchMethodException {
239     Method method = Object.class.getMethod("notify");
240     try {
241       getAndroidMockGenerator().getInterfaceMethodSource(method);
242       fail("Exception not thrown on a final method");
243     } catch (UnsupportedOperationException e) {
244       // expected
245     }
246   }
247 
testGetInterfaceMethodSourceStatic()248   public void testGetInterfaceMethodSourceStatic() throws SecurityException, NoSuchMethodException {
249     Method method = Thread.class.getMethod("currentThread");
250     try {
251       getAndroidMockGenerator().getInterfaceMethodSource(method);
252       fail("Exception not thrown on a static method");
253     } catch (UnsupportedOperationException e) {
254       // expected
255     }
256   }
257 
testGetInterfaceName()258   public void testGetInterfaceName() {
259     AndroidMockGenerator r = getAndroidMockGenerator();
260     assertEquals("genmocks.java.lang.ObjectDelegateInterface",
261         FileUtils.getInterfaceNameFor(Object.class, SdkVersion.UNKNOWN));
262   }
263 
testGetSubclassName()264   public void testGetSubclassName() {
265     AndroidMockGenerator r = getAndroidMockGenerator();
266     assertEquals("genmocks.java.lang.ObjectDelegateSubclass",
267         FileUtils.getSubclassNameFor(Object.class, SdkVersion.UNKNOWN));
268   }
269 
testGetDelegateMethodSource()270   public void testGetDelegateMethodSource() throws SecurityException, NoSuchMethodException {
271     Method method = Object.class.getMethod("equals", Object.class);
272     assertEquals("public boolean equals(java.lang.Object arg0){if(this.delegateMockObject==null){"
273         + "return false;}return this.delegateMockObject.equals(arg0);}", getAndroidMockGenerator()
274         .getDelegateMethodSource(method));
275   }
276 
testGetDelegateMethodSourceAllTypes()277   public void testGetDelegateMethodSourceAllTypes() throws SecurityException,
278       NoSuchMethodException {
279     String[] returnTypes =
280         new String[] {"boolean", "byte", "short", "int", "long", "char", "float", "double"};
281     String[] castTypes =
282         new String[] {"false", "(byte)0", "(short)0", "(int)0", "(long)0", "(char)0", "(float)0",
283             "(double)0"};
284     for (int i = 0; i < returnTypes.length; ++i) {
285       Method method = AllTypes.class.getMethod(returnTypes[i] + "Foo");
286       assertEquals("public " + returnTypes[i] + " " + returnTypes[i]
287           + "Foo(){if(this.delegateMockObject==null){return " + castTypes[i]
288           + ";}return this.delegateMockObject." + returnTypes[i] + "Foo();}",
289           getAndroidMockGenerator().getDelegateMethodSource(method));
290     }
291     Method method = AllTypes.class.getMethod("objectFoo");
292     assertEquals("public java.lang.Object objectFoo(){if(this.delegateMockObject==null){return "
293         + "null;}return this.delegateMockObject.objectFoo();}", getAndroidMockGenerator()
294         .getDelegateMethodSource(method));
295     method = AllTypes.class.getMethod("voidFoo");
296     assertEquals("public void voidFoo(){if(this.delegateMockObject==null){return ;"
297         + "}this.delegateMockObject.voidFoo();}", getAndroidMockGenerator()
298         .getDelegateMethodSource(method));
299   }
300 
301   private class AllTypes {
302     @SuppressWarnings("unused")
voidFoo()303     public void voidFoo() {
304     }
305 
306     @SuppressWarnings("unused")
booleanFoo()307     public boolean booleanFoo() {
308       return false;
309     }
310 
311     @SuppressWarnings("unused")
byteFoo()312     public byte byteFoo() {
313       return 0;
314     }
315 
316     @SuppressWarnings("unused")
shortFoo()317     public short shortFoo() {
318       return 0;
319     }
320 
321     @SuppressWarnings("unused")
intFoo()322     public int intFoo() {
323       return 0;
324     }
325 
326     @SuppressWarnings("unused")
longFoo()327     public long longFoo() {
328       return 0;
329     }
330 
331     @SuppressWarnings("unused")
charFoo()332     public char charFoo() {
333       return 0;
334     }
335 
336     @SuppressWarnings("unused")
floatFoo()337     public float floatFoo() {
338       return 0;
339     }
340 
341     @SuppressWarnings("unused")
doubleFoo()342     public double doubleFoo() {
343       return 0;
344     }
345 
346     @SuppressWarnings("unused")
objectFoo()347     public Object objectFoo() {
348       return null;
349     }
350   }
351 
testGetDelegateMethodSourceMultipleExceptions()352   public void testGetDelegateMethodSourceMultipleExceptions() throws SecurityException,
353       NoSuchMethodException {
354     Method method = Class.class.getDeclaredMethod("newInstance");
355     assertEquals(
356         "public java.lang.Object newInstance() throws java.lang.InstantiationException,"
357             + "java.lang.IllegalAccessException{if(this.delegateMockObject==null){return null;}"
358             + "return this.delegateMockObject.newInstance();}", getAndroidMockGenerator()
359             .getDelegateMethodSource(method));
360   }
361 
testGetDelegateMethodSourceProtectedMethod()362   public void testGetDelegateMethodSourceProtectedMethod() throws SecurityException,
363       NoSuchMethodException {
364     Method method = Object.class.getDeclaredMethod("finalize");
365     assertEquals("public void finalize() throws java.lang.Throwable{if(this.delegateMockObject=="
366         + "null){return ;}this.delegateMockObject.finalize();}", getAndroidMockGenerator()
367         .getDelegateMethodSource(method));
368   }
369 
testGetDelegateMethodSourceMultiParams()370   public void testGetDelegateMethodSourceMultiParams() throws SecurityException,
371       NoSuchMethodException {
372     Method method =
373         String.class.getMethod("getChars", Integer.TYPE, Integer.TYPE, char[].class, Integer.TYPE);
374     assertEquals(
375         "public void getChars(int arg0,int arg1,char[] arg2,int arg3){if(this."
376             + "delegateMockObject==null){return ;}this.delegateMockObject.getChars(arg0,arg1,arg2,"
377             + "arg3);}", getAndroidMockGenerator().getDelegateMethodSource(method));
378   }
379 
testGetDelegateMethodSourceNoParams()380   public void testGetDelegateMethodSourceNoParams() throws SecurityException,
381       NoSuchMethodException {
382     Method method = Object.class.getMethod("toString");
383     assertEquals(
384         "public java.lang.String toString(){if(this.delegateMockObject==null){return null;"
385             + "}return this.delegateMockObject.toString();}", getAndroidMockGenerator()
386             .getDelegateMethodSource(method));
387   }
388 
testGetDelegateMethodSourceVoidReturn()389   public void testGetDelegateMethodSourceVoidReturn() throws SecurityException,
390       NoSuchMethodException {
391     Method method = Thread.class.getMethod("run");
392     assertEquals("public void run(){if(this.delegateMockObject==null){return ;}this."
393         + "delegateMockObject.run();}", getAndroidMockGenerator().getDelegateMethodSource(method));
394   }
395 
testGetDelegateMethodSourceFinal()396   public void testGetDelegateMethodSourceFinal() throws SecurityException, NoSuchMethodException {
397     Method method = Object.class.getMethod("notify");
398     try {
399       getAndroidMockGenerator().getDelegateMethodSource(method);
400       fail("Exception not thrown on a final method");
401     } catch (UnsupportedOperationException e) {
402       // expected
403     }
404   }
405 
testGetDelegateMethodSourceStatic()406   public void testGetDelegateMethodSourceStatic() throws SecurityException, NoSuchMethodException {
407     Method method = Thread.class.getMethod("currentThread");
408     try {
409       getAndroidMockGenerator().getDelegateMethodSource(method);
410       fail("Exception not thrown on a static method");
411     } catch (UnsupportedOperationException e) {
412       // expected
413     }
414   }
415 
testGenerateEmptySubclass()416   public void testGenerateEmptySubclass() throws ClassNotFoundException, NotFoundException {
417     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
418     CtClass generatedInterface = mockGenerator.generateInterface(String.class, SdkVersion.UNKNOWN);
419     CtClass generatedClass = getAndroidMockGenerator().generateSkeletalClass(
420         String.class, generatedInterface, SdkVersion.UNKNOWN);
421 
422     assertEquals("genmocks.java.lang", generatedClass.getPackageName());
423     assertEquals("StringDelegateSubclass", generatedClass.getSimpleName());
424     assertEquals("java.lang.String", generatedClass.getSuperclass().getName());
425     cleanupGeneratedClasses(generatedInterface, generatedClass);
426   }
427 
testAddMethods()428   public void testAddMethods() throws ClassNotFoundException {
429     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
430     CtClass generatedInterface = mockGenerator.generateInterface(Number.class, SdkVersion.UNKNOWN);
431     CtClass generatedClass =
432         mockGenerator.generateSkeletalClass(Number.class, generatedInterface, SdkVersion.UNKNOWN);
433 
434     mockGenerator.addMethods(Number.class, generatedClass);
435 
436     List<String> expectedNames = getExpectedNamesForNumberClass();
437     List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
438     assertUnorderedContentsSame(expectedNames, actualNames);
439     cleanupGeneratedClasses(generatedInterface, generatedClass);
440   }
441 
testAddMethodsObjectClass()442   public void testAddMethodsObjectClass() throws ClassNotFoundException {
443     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
444     CtClass generatedInterface = mockGenerator.generateInterface(Object.class, SdkVersion.UNKNOWN);
445     CtClass generatedClass =
446         mockGenerator.generateSkeletalClass(Object.class, generatedInterface, SdkVersion.UNKNOWN);
447 
448     mockGenerator.addMethods(Object.class, generatedClass);
449 
450     List<String> expectedNames = getExpectedNamesForObjectClass();
451     List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
452     assertUnorderedContentsSame(expectedNames, actualNames);
453     cleanupGeneratedClasses(generatedInterface, generatedClass);
454   }
455 
testAddMethodsUsesSuperclass()456   public void testAddMethodsUsesSuperclass() throws ClassNotFoundException {
457     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
458     CtClass generatedInterface = mockGenerator.generateInterface(
459         BigInteger.class, SdkVersion.UNKNOWN);
460     CtClass generatedClass = mockGenerator.generateSkeletalClass(
461         BigInteger.class, generatedInterface, SdkVersion.UNKNOWN);
462 
463     mockGenerator.addMethods(BigInteger.class, generatedClass);
464 
465     List<String> expectedNames = getExpectedNamesForBigIntegerClass();
466     List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
467     assertUnorderedContentsSame(expectedNames, actualNames);
468     cleanupGeneratedClasses(generatedInterface, generatedClass);
469   }
470 
testGetAllMethods()471   public void testGetAllMethods() throws ClassNotFoundException {
472     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
473     CtClass generatedInterface = mockGenerator.generateInterface(
474         BigInteger.class, SdkVersion.UNKNOWN);
475     CtClass generatedClass = mockGenerator.generateSkeletalClass(
476         BigInteger.class, generatedInterface, SdkVersion.UNKNOWN);
477 
478     Method[] methods = mockGenerator.getAllMethods(BigInteger.class);
479 
480     List<String> expectedNames = getExpectedSignaturesForBigIntegerClass();
481     List<String> actualNames = getMethodSignatures(methods);
482     assertUnorderedContentsSame(expectedNames, actualNames);
483     cleanupGeneratedClasses(generatedInterface, generatedClass);
484   }
485 
testGenerateInterface()486   public void testGenerateInterface() {
487     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
488     CtClass generatedInterface = mockGenerator.generateInterface(Number.class, SdkVersion.UNKNOWN);
489 
490     List<String> expectedNames = getExpectedNamesForNumberClass();
491     List<String> actualNames = getMethodNames(generatedInterface.getDeclaredMethods());
492     assertUnorderedContentsSame(expectedNames, actualNames);
493     cleanupGeneratedClasses(generatedInterface);
494   }
495 
testAddInterfaceMethods()496   public void testAddInterfaceMethods() {
497     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
498     CtClass generatedInterface = AndroidMockGenerator.getClassPool().makeInterface("testInterface");
499 
500     mockGenerator.addInterfaceMethods(Number.class, generatedInterface);
501 
502     List<String> expectedNames = getExpectedNamesForNumberClass();
503     List<String> actualNames = getMethodNames(generatedInterface.getDeclaredMethods());
504     assertUnorderedContentsSame(expectedNames, actualNames);
505     cleanupGeneratedClasses(generatedInterface);
506   }
507 
testGenerateSubclass()508   public void testGenerateSubclass() throws ClassNotFoundException {
509     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
510     CtClass generatedInterface = mockGenerator.generateInterface(Number.class, SdkVersion.UNKNOWN);
511 
512     CtClass generatedClass =
513         mockGenerator.generateSubClass(Number.class, generatedInterface, SdkVersion.UNKNOWN);
514 
515     List<String> expectedNames = getExpectedNamesForNumberClass(true);
516     List<String> actualNames = getMethodNames(generatedClass.getDeclaredMethods());
517     assertUnorderedContentsSame(expectedNames, actualNames);
518     cleanupGeneratedClasses(generatedInterface, generatedClass);
519   }
520 
testCreateMockForClass()521   public void testCreateMockForClass() throws ClassNotFoundException, IOException,
522       CannotCompileException, NotFoundException {
523     NoFileAndroidMockGenerator mockGenerator = getNoFileMockGenerator();
524     List<GeneratedClassFile> classes = mockGenerator.createMocksForClass(Object.class);
525 
526     List<String> expectedNames = new ArrayList<String>();
527     String subclassName = "genmocks.java.lang.ObjectDelegateSubclass";
528     String interfaceName = "genmocks.java.lang.ObjectDelegateInterface";
529     expectedNames.addAll(Arrays.asList(new String[] {subclassName,
530         interfaceName}));
531     List<String> actualNames = getClassNames(classes);
532     assertUnorderedContentsSame(expectedNames, actualNames);
533     cleanupGeneratedClasses(
534         ClassPool.getDefault().get(subclassName),
535         ClassPool.getDefault().get(interfaceName));
536   }
537 
testGetSetDelegateMethodSource()538   public void testGetSetDelegateMethodSource() {
539     AndroidMockGenerator mockGenerator = getAndroidMockGenerator();
540     CtClass generatedInterface = mockGenerator.generateInterface(Object.class, SdkVersion.UNKNOWN);
541     String expectedSource =
542         "public void setDelegate___AndroidMock(genmocks.java.lang.ObjectDelegateInterface obj) {"
543             + " this.delegateMockObject = obj;}";
544 
545     assertEquals(expectedSource, mockGenerator.getSetDelegateMethodSource(generatedInterface));
546   }
547 
testIsForbiddenMethod()548   public void testIsForbiddenMethod() throws SecurityException, NoSuchMethodException {
549     Method[] forbiddenMethods =
550         new Method[] {Object.class.getMethod("equals", Object.class),
551             Object.class.getMethod("toString"), Object.class.getMethod("hashCode")};
552     Method[] allowedMethods = new Method[] {BigInteger.class.getMethod("toString", Integer.TYPE)};
553     for (Method method : forbiddenMethods) {
554       assertTrue(getAndroidMockGenerator().isForbiddenMethod(method));
555     }
556     for (Method method : allowedMethods) {
557       assertFalse(getAndroidMockGenerator().isForbiddenMethod(method));
558     }
559   }
560 
561   /**
562    * Support test class for capturing the names of files that would have been
563    * saved to a jar file.
564    *
565    * @author swoodward@google.com (Stephen Woodward)
566    */
567   class NoFileAndroidMockGenerator extends AndroidMockGenerator {
568     List<CtClass> savedClasses = new ArrayList<CtClass>();
569 
570     @Override
saveCtClass(CtClass clazz)571     void saveCtClass(CtClass clazz) {
572       savedClasses.add(clazz);
573     }
574   }
575 }
576