package com.github.davidmoten.rx;
import static org.junit.Assert.assertEquals;
import java.lang.reflect.Method;
import org.junit.Test;
import com.github.davidmoten.rx.jdbc.annotations.Column;
import com.github.davidmoten.rx.jdbc.annotations.Index;
public class DynamicProxyTest {
public static interface Thing {
@Column("table_id")
int id();
int nonNullNumber();
@Index(2)
String name();
@Column("desc")
String description();
}
@Test
public void testDynamicProxy() {
Thing t = ProxyService.newInstance(Thing.class);
assertEquals(123, t.id());
assertEquals("fred 2", t.name());
assertEquals("he's the business! desc", t.description());
}
@Test(expected = NullPointerException.class)
public void testDynamicProxyReturnsNullForNonNullMethod() {
Thing t = ProxyService.newInstance(Thing.class);
t.nonNullNumber();
}
public static class ProxyService implements java.lang.reflect.InvocationHandler {
@SuppressWarnings("unchecked")
public static <T> T newInstance(Class<T> cls) {
return (T) java.lang.reflect.Proxy.newProxyInstance(cls.getClassLoader(),
new Class[] { cls }, new ProxyService());
}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Column a = m.getAnnotation(Column.class);
final String column;
if (a == null || a.value().equals(Column.NOT_SPECIFIED))
column = null;
else
column = a.value();
String name = m.getName();
if (name.equals("id")) {
return 123;
} else if (name.equals("name")) {
return "fred " + m.getAnnotation(Index.class).value();
} else if (name.equals("description")) {
return "he's the business! " + column;
} else if (name.equals("nonNullNumber"))
return null;
else
throw new RuntimeException("unexpected");
}
}
}