1 package javassist; 2 import java.lang.reflect.Method; 3 4 import junit.framework.TestCase; 5 6 @SuppressWarnings({"rawtypes","unchecked"}) 7 public class SetterTest extends TestCase { 8 9 ClassPool pool; 10 Class<?> capability; 11 SetterTest(String name)12 public SetterTest(String name) { 13 super(name); 14 } 15 setUp()16 protected void setUp() throws Exception { 17 super.setUp(); 18 pool = ClassPool.getDefault(); 19 capability = Class.forName("DefineClassCapability"); 20 } 21 22 /** 23 * Tests a getter only on a field without a Modifier. 24 * 25 * @throws Exception 26 */ testFieldGetter()27 public void testFieldGetter() throws Exception { 28 CtClass clazz = pool.makeClass("HasFieldGetter"); 29 clazz.setSuperclass(pool.get("java.lang.Object")); 30 CtField field = new CtField(CtClass.booleanType, "broken", clazz); 31 clazz.addField(field, "true"); 32 clazz.addMethod(CtNewMethod.getter("isBroken", field)); 33 Class _class = clazz.toClass(capability); 34 35 Object object = _class.getConstructor().newInstance(); 36 check(_class, object, true); 37 } 38 39 /** 40 * Tests a getter and a setter on a field without a Modifier. 41 * 42 * @throws Exception 43 */ testFieldGetterSetter()44 public void testFieldGetterSetter() throws Exception { 45 CtClass clazz = pool.makeClass("HasFieldGetterSetter"); 46 clazz.setSuperclass(pool.get("java.lang.Object")); 47 CtField field = new CtField(CtClass.booleanType, "broken", clazz); 48 clazz.addField(field, "true"); 49 clazz.addMethod(CtNewMethod.getter("isBroken", field)); 50 clazz.addMethod(CtNewMethod.setter("setBroken", field)); 51 Class _class = clazz.toClass(capability); 52 53 Object object = _class.getConstructor().newInstance(); 54 55 set(_class, object, false); 56 check(_class, object, false); 57 } 58 59 /** 60 * Tests a getter only on a field with Modifier.STATIC. 61 * 62 * @throws Exception 63 */ testStaticFieldGetter()64 public void testStaticFieldGetter() throws Exception { 65 CtClass clazz = pool.makeClass("HasStaticFieldGetter"); 66 clazz.setSuperclass(pool.get("java.lang.Object")); 67 CtField field = new CtField(CtClass.booleanType, "broken", clazz); 68 field.setModifiers(Modifier.STATIC); 69 clazz.addField(field, "true"); 70 clazz.addMethod(CtNewMethod.getter("isBroken", field)); 71 Class _class = clazz.toClass(capability); 72 73 Object object = _class.getConstructor().newInstance(); 74 check(_class, object, true); 75 } 76 77 /** 78 * Tests a getter and setter on a field with Modifier.STATIC. 79 * 80 * @throws Exception 81 */ testStaticFieldGetterSetter()82 public void testStaticFieldGetterSetter() throws Exception { 83 CtClass clazz = pool.makeClass("HasStaticFieldGetterSetter"); 84 clazz.setSuperclass(pool.get("java.lang.Object")); 85 CtField field = new CtField(CtClass.booleanType, "broken", clazz); 86 field.setModifiers(Modifier.STATIC); 87 clazz.addField(field, "true"); 88 clazz.addMethod(CtNewMethod.getter("isBroken", field)); 89 clazz.addMethod(CtNewMethod.setter("setBroken", field)); 90 Class _class = clazz.toClass(capability); 91 92 Object object = _class.getConstructor().newInstance(); 93 94 set(_class, object, false); 95 check(_class, object, false); 96 } 97 check(Class _class, Object object, boolean shouldBe)98 private void check(Class _class, Object object, boolean shouldBe) 99 throws Exception 100 { 101 Method method = _class.getMethod("isBroken", new Class[] {}); 102 Boolean result = (Boolean) method.invoke(object, new Object[] {}); 103 assertEquals("boolean is wrong value", 104 shouldBe, result.booleanValue()); 105 } 106 set(Class _class, Object object, boolean willBe)107 private void set(Class _class, Object object, boolean willBe) 108 throws Exception 109 { 110 Method method = _class.getMethod("setBroken", 111 new Class[] {Boolean.TYPE}); 112 method.invoke(object, new Object[] { Boolean.valueOf(willBe)}); 113 } 114 } 115