You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by df...@apache.org on 2009/03/08 09:45:01 UTC

svn commit: r751384 - /commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java

Author: dfabulich
Date: Sun Mar  8 08:45:01 2009
New Revision: 751384

URL: http://svn.apache.org/viewvc?rev=751384&view=rev
Log:
Added additional test for fillStatement and nulls

Modified:
    commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java

Modified: commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java?rev=751384&r1=751383&r2=751384&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java (original)
+++ commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java Sun Mar  8 08:45:01 2009
@@ -20,8 +20,11 @@
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.sql.ParameterMetaData;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
+import java.sql.Types;
 import java.util.Arrays;
 
 import junit.framework.TestCase;
@@ -30,11 +33,69 @@
     QueryRunner runner;
     PreparedStatement stmt;
     
+    static final Method getParameterCount, getParameterType, getParameterMetaData;
+    static {
+        try {
+            getParameterCount = ParameterMetaData.class.getMethod("getParameterCount", new Class[0]);
+            getParameterType = ParameterMetaData.class.getMethod("getParameterType", new Class[]{int.class});
+            getParameterMetaData = PreparedStatement.class.getMethod("getParameterMetaData", new Class[0]);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+    
     public void setUp() {
         runner = new QueryRunner();
         stmt = fakePreparedStatement();
     }
     
+    public void testFillStatementWithNull() throws Exception {
+        stmt = fakeFillablePreparedStatement(false, new int[] {Types.VARCHAR, Types.BIGINT});
+        runner.fillStatement(stmt, new Object[] { null, null }); 
+    }
+    
+    public void testFillStatementWithNullOracle() throws Exception {
+        stmt = fakeFillablePreparedStatement(true, new int[] {Types.VARCHAR, Types.BIGINT});
+        runner.fillStatement(stmt, new Object[] { null, null });
+    }
+
+    private PreparedStatement fakeFillablePreparedStatement(final boolean simulateOracle, final int[] types) throws NoSuchMethodException {
+        // prepare a mock ParameterMetaData and a mock PreparedStatement to return the PMD
+        final ParameterMetaData pmd = mockParameterMetaData(simulateOracle,types);
+        InvocationHandler stmtHandler = new InvocationHandler() {
+            public Object invoke(Object proxy, Method method, Object[] args)
+                    throws Throwable {
+                if (getParameterMetaData.equals(method)) {
+                    return pmd;
+                }
+                return null;
+            }
+        };
+        return ProxyFactory.instance().createPreparedStatement(stmtHandler);
+    }
+
+    private ParameterMetaData mockParameterMetaData(final boolean simulateOracle, final int[] types) {
+        InvocationHandler pmdHandler = new InvocationHandler() {
+            public Object invoke(Object proxy, Method method, Object[] args)
+                    throws Throwable {
+                if (getParameterCount.equals(method)) {
+                    return new Integer(types.length);
+                }
+                if (getParameterType.equals(method)) {
+                    if (simulateOracle) throw new SQLException("Oracle fails when you call getParameterType");
+                    int arg = ((Integer)args[0]).intValue();
+                    return new Integer(types[arg-1]);
+                }
+                return null;
+            }
+        };
+        
+        return (ParameterMetaData) Proxy.newProxyInstance(
+                pmdHandler.getClass().getClassLoader(),
+                new Class[] {ParameterMetaData.class},
+                pmdHandler);
+    }
+    
     public void testFillStatementWithBean() throws SQLException {
         TestBean tb = new TestBean();
         tb.setOne("uno");
@@ -137,4 +198,5 @@
             this.params = params;
         }
     }
+
 }