package net.ttddyy.dsproxy.proxy;
import net.ttddyy.dsproxy.listener.QueryExecutionListener;
import net.ttddyy.dsproxy.proxy.jdk.ConnectionInvocationHandler;
import net.ttddyy.dsproxy.proxy.jdk.JdkJdbcProxyFactory;
import net.ttddyy.dsproxy.transform.QueryTransformer;
import org.junit.Test;
import javax.sql.DataSource;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
/**
* @author Tadaya Tsuyukubo
*/
public class DataSourceProxyLogicMockTest {
private static final String DS_NAME = "myDS";
@Test
public void testGetConnection() throws Throwable {
DataSource ds = mock(DataSource.class);
DataSourceProxyLogic logic = getProxyLogic(ds);
Method method = DataSource.class.getMethod("getConnection");
Object result = logic.invoke(method, null);
assertThat(result, is(instanceOf(Connection.class)));
verifyConnection((Connection) result);
verify(ds).getConnection();
}
private DataSourceProxyLogic getProxyLogic(DataSource ds) {
QueryExecutionListener listener = mock(QueryExecutionListener.class);
InterceptorHolder interceptorHolder = new InterceptorHolder(listener, QueryTransformer.DEFAULT);
return new DataSourceProxyLogic(ds, interceptorHolder, DS_NAME, new JdkJdbcProxyFactory());
}
private void verifyConnection(Connection conn) {
assertThat(conn, notNullValue());
assertThat(Proxy.isProxyClass(conn.getClass()), is(true));
InvocationHandler handler = Proxy.getInvocationHandler(conn);
assertThat(handler, is(instanceOf(ConnectionInvocationHandler.class)));
assertThat(conn, is(instanceOf(ProxyJdbcObject.class)));
}
@Test
public void testGetTarget() throws Throwable {
DataSource ds = mock(DataSource.class);
DataSourceProxyLogic logic = getProxyLogic(ds);
Method method = ProxyJdbcObject.class.getMethod("getTarget");
Object result = logic.invoke(method, null);
assertThat(result, is(instanceOf(DataSource.class)));
DataSource resultDS = (DataSource) result;
assertThat(resultDS, is(sameInstance(ds)));
}
@Test
public void testUnwrap() throws Throwable {
DataSource ds = mock(DataSource.class);
when(ds.unwrap(String.class)).thenReturn("called");
DataSourceProxyLogic logic = getProxyLogic(ds);
Method method = Connection.class.getMethod("unwrap", Class.class);
Object result = logic.invoke(method, new Object[]{String.class});
verify(ds).unwrap(String.class);
assertThat(result, is(instanceOf(String.class)));
assertThat((String) result, is("called"));
}
@Test
public void testIsWrapperFor() throws Throwable {
DataSource ds = mock(DataSource.class);
when(ds.isWrapperFor(String.class)).thenReturn(true);
DataSourceProxyLogic logic = getProxyLogic(ds);
Method method = Connection.class.getMethod("isWrapperFor", Class.class);
Object result = logic.invoke(method, new Object[]{String.class});
verify(ds).isWrapperFor(String.class);
assertThat(result, is(instanceOf(boolean.class)));
assertThat((Boolean) result, is(true));
}
}