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