/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Other licenses:
 * -----------------------------------------------------------------------------
 * Commercial licenses for this work are available. These replace the above
 * ASL 2.0 and offer limited warranties, support, maintenance, and commercial
 * database integrations.
 *
 * For more information, please visit: http://www.jooq.org/licenses
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package org.jooq.tools.jdbc;

import static org.jooq.SQLDialect.DEFAULT;

import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;

// ...

A mock connection.

Mock connections can be used to supply jOOQ with unit test data, avoiding the round-trip of using an actual in-memory test database, such as Derby, H2 or HSQLDB. A usage example:

MockDataProvider provider = new MockDataProvider() {
    public MockResult[] execute(MockExecuteContext context) throws SQLException {
        Result<MyTableRecord> result = executor.newResult(MY_TABLE);
        result.add(executor.newRecord(MY_TABLE));
        return new MockResult[] {
            new MockResult(1, result)
        };
    }
};
Connection connection = new MockConnection(provider);
DSLContext create = DSL.using(connection, dialect);
assertEquals(1, create.selectOne().fetch().size());

While this MockConnection can be used independently of jOOQ, it has been optimised for usage with jOOQ. JDBC features that are not used by jOOQ (e.g. procedure bind value access by parameter name) are not supported in this mock framework

Author:Lukas Eder
/** * A mock connection. * <p> * Mock connections can be used to supply jOOQ with unit test data, avoiding the * round-trip of using an actual in-memory test database, such as Derby, H2 or * HSQLDB. A usage example: * <p> * <code><pre> * MockDataProvider provider = new MockDataProvider() { * public MockResult[] execute(MockExecuteContext context) throws SQLException { * Result&lt;MyTableRecord&gt; result = executor.newResult(MY_TABLE); * result.add(executor.newRecord(MY_TABLE)); * * return new MockResult[] { * new MockResult(1, result) * }; * } * }; * Connection connection = new MockConnection(provider); * DSLContext create = DSL.using(connection, dialect); * assertEquals(1, create.selectOne().fetch().size()); * </pre></code> * <p> * While this <code>MockConnection</code> can be used independently of jOOQ, it * has been optimised for usage with jOOQ. JDBC features that are not used by * jOOQ (e.g. procedure bind value access by parameter name) are not supported * in this mock framework * * @author Lukas Eder */
public class MockConnection extends JDBC41Connection implements Connection { private final MockDataProvider data; private boolean isClosed; public MockConnection(MockDataProvider data) { this.data = data; } // ------------------------------------------------------------------------- // XXX: Utilities // ------------------------------------------------------------------------- private void checkNotClosed() throws SQLException { if (isClosed) { throw new SQLException("Connection is already closed"); } } // ------------------------------------------------------------------------- // XXX: Creating statements // ------------------------------------------------------------------------- @Override public Statement createStatement() throws SQLException { return createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { return createStatement(resultSetType, resultSetConcurrency, ResultSet.CLOSE_CURSORS_AT_COMMIT); } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkNotClosed(); MockStatement result = new MockStatement(this, data); result.resultSetType = resultSetType; result.resultSetConcurrency = resultSetConcurrency; result.resultSetHoldability = resultSetHoldability; return result; } @Override public PreparedStatement prepareStatement(String sql) throws SQLException { return prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return prepareStatement(sql, resultSetType, resultSetConcurrency, ResultSet.CLOSE_CURSORS_AT_COMMIT); } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkNotClosed(); MockStatement result = new MockStatement(this, data, sql); result.resultSetType = resultSetType; result.resultSetConcurrency = resultSetConcurrency; result.resultSetHoldability = resultSetHoldability; return result; } @Override public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { checkNotClosed(); MockStatement result = new MockStatement(this, data, sql); result.autoGeneratedKeys = autoGeneratedKeys; return result; } @Override public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { checkNotClosed(); MockStatement result = new MockStatement(this, data, sql); result.autoGeneratedKeys = Statement.RETURN_GENERATED_KEYS; result.columnIndexes = columnIndexes; return result; } @Override public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { checkNotClosed(); MockStatement result = new MockStatement(this, data, sql); result.autoGeneratedKeys = Statement.RETURN_GENERATED_KEYS; result.columnNames = columnNames; return result; } @Override public CallableStatement prepareCall(String sql) throws SQLException { return prepareCall(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT); } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { return prepareCall(sql, resultSetType, resultSetConcurrency, ResultSet.CLOSE_CURSORS_AT_COMMIT); } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { checkNotClosed(); MockStatement result = new MockStatement(this, data, sql); result.resultSetType = resultSetType; result.resultSetConcurrency = resultSetConcurrency; result.resultSetHoldability = resultSetHoldability; return result; } // ------------------------------------------------------------------------- // XXX: Ignored operations // ------------------------------------------------------------------------- @Override public void commit() throws SQLException { checkNotClosed(); } @Override public void rollback() throws SQLException { checkNotClosed(); } @Override public void rollback(Savepoint savepoint) throws SQLException { checkNotClosed(); } @Override public void close() throws SQLException { isClosed = true; } @Override public Savepoint setSavepoint() throws SQLException { checkNotClosed(); return new MockSavepoint(); } @Override public Savepoint setSavepoint(String name) throws SQLException { checkNotClosed(); return new MockSavepoint(name); } @Override public void releaseSavepoint(Savepoint savepoint) throws SQLException { checkNotClosed(); } @Override public boolean isClosed() throws SQLException { return isClosed; } @Override public void setAutoCommit(boolean autoCommit) throws SQLException { checkNotClosed(); } @Override public boolean getAutoCommit() throws SQLException { checkNotClosed(); return false; } @Override public void setReadOnly(boolean readOnly) throws SQLException { checkNotClosed(); } @Override public boolean isReadOnly() throws SQLException { checkNotClosed(); return false; } @Override public void setCatalog(String catalog) throws SQLException { checkNotClosed();} @Override public String getCatalog() throws SQLException { checkNotClosed(); return null; } @Override public SQLWarning getWarnings() throws SQLException { checkNotClosed(); return null; } @Override public void clearWarnings() throws SQLException { checkNotClosed(); } @Override public void setTransactionIsolation(int level) throws SQLException { checkNotClosed(); } @Override public int getTransactionIsolation() throws SQLException { checkNotClosed(); return 0; } @Override public void setTypeMap(Map<String, Class<?>> map) throws SQLException { checkNotClosed(); } @Override public Map<String, Class<?>> getTypeMap() throws SQLException { checkNotClosed(); return null; } @Override public void setHoldability(int holdability) throws SQLException { checkNotClosed(); } @Override public int getHoldability() throws SQLException { checkNotClosed(); return 0; } @Override public boolean isValid(int timeout) throws SQLException { checkNotClosed(); return false; } @Override public void setClientInfo(String name, String value) throws SQLClientInfoException { } @Override public void setClientInfo(Properties properties) throws SQLClientInfoException { } @Override public String getClientInfo(String name) throws SQLException { checkNotClosed(); return null; } @Override public Properties getClientInfo() throws SQLException { checkNotClosed(); return null; } // ------------------------------------------------------------------------- // XXX: Object creation // ------------------------------------------------------------------------- @Override @SuppressWarnings("unchecked") public Array createArrayOf(String typeName, Object[] elements) throws SQLException { return new MockArray<>(DEFAULT, elements, (Class<? extends Object[]>) (elements == null ? Object[].class : elements.getClass())); } // ------------------------------------------------------------------------- // XXX: Unwrapping // ------------------------------------------------------------------------- @SuppressWarnings("unchecked") @Override public <T> T unwrap(Class<T> iface) throws SQLException { if (isWrapperFor(iface)) return (T) this; else throw new SQLException("MockConnection does not implement " + iface); } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return iface.isInstance(this); } // ------------------------------------------------------------------------- // XXX: Vendor specific driver compatibility operations // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- // XXX: Unsupported operations // ------------------------------------------------------------------------- @Override public DatabaseMetaData getMetaData() throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } @Override public String nativeSQL(String sql) throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } @Override public Clob createClob() throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } @Override public Blob createBlob() throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } @Override public NClob createNClob() throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } @Override public SQLXML createSQLXML() throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } @Override public Struct createStruct(String typeName, Object[] attributes) throws SQLException { throw new SQLFeatureNotSupportedException("Unsupported Operation"); } }