}
@Test
public void testProxyMethod() throws NoSuchMethodException, SecurityException, Throwable {
Foo foo = new Foo();
MethodProxy proxy = ReflectUtils.getMethodProxy(Foo.class.getMethod("setProperty", String.class, boolean.class));
Assert.assertThat(proxy.invoke(foo, "proxy foo", true), nullValue());
Assert.assertThat(foo.getName(), is("proxy foo"));
Assert.assertThat(foo.isFailure(), is(true));
proxy = ReflectUtils.getMethodProxy(ReflectUtils.getGetterMethod(Foo.class, "name"));
Assert.assertThat((String)proxy.invoke(foo), is("proxy foo"));
proxy = ReflectUtils.getMethodProxy(ReflectUtils.getGetterMethod(Foo.class, "failure"));
Assert.assertThat((Boolean)proxy.invoke(foo), is(true));
proxy = ReflectUtils.getMethodProxy(ReflectUtils.getSetterMethod(Foo.class, "price"));
Assert.assertThat(proxy.invoke(foo, 35.5), nullValue());
Assert.assertThat(foo.getPrice(), is(35.5));
MethodProxyFactoryUsingJavaCompiler proxyUsingJavaCompiler = MethodProxyFactoryUsingJavaCompiler.INSTANCE;
Foo foo2 = new Foo();
MethodProxy proxy2 = proxyUsingJavaCompiler.getMethodProxy(Foo.class.getMethod("setProperty", String.class, boolean.class));
Assert.assertThat(proxy2.invoke(foo2, "proxy foo", true), nullValue());
Assert.assertThat(foo2.getName(), is("proxy foo"));
Assert.assertThat(foo2.isFailure(), is(true));
proxy2 = proxyUsingJavaCompiler.getMethodProxy(ReflectUtils.getGetterMethod(Foo.class, "name"));
Assert.assertThat((String)proxy2.invoke(foo2), is("proxy foo"));
proxy2 = proxyUsingJavaCompiler.getMethodProxy(ReflectUtils.getGetterMethod(Foo.class, "failure"));
Assert.assertThat((Boolean)proxy2.invoke(foo2), is(true));
proxy2 = proxyUsingJavaCompiler.getMethodProxy(ReflectUtils.getSetterMethod(Foo.class, "price"));
Assert.assertThat(proxy2.invoke(foo2, 35.5), nullValue());
Assert.assertThat(foo2.getPrice(), is(35.5));
}