public void testSqlMapClientTemplate() throws SQLException {
    MockControl dsControl = MockControl.createControl(DataSource.class);
    DataSource ds = (DataSource) dsControl.getMock();
    MockControl conControl = MockControl.createControl(Connection.class);
    Connection con = (Connection) conControl.getMock();
    ds.getConnection();
    dsControl.setReturnValue(con, 1);
    con.close();
    conControl.setVoidCallable(1);
    dsControl.replay();
    conControl.replay();

    MockControl sessionControl = MockControl.createControl(SqlMapSession.class);
    final SqlMapSession session = (SqlMapSession) sessionControl.getMock();
    MockControl clientControl = MockControl.createControl(SqlMapClient.class);
    SqlMapClient client = (SqlMapClient) clientControl.getMock();
    client.openSession();
    clientControl.setReturnValue(session, 1);
    session.getCurrentConnection();
    sessionControl.setReturnValue(null, 1);
    session.setUserConnection(con);
    sessionControl.setVoidCallable(1);
    session.close();
    sessionControl.setVoidCallable(1);
    sessionControl.replay();
    clientControl.replay();

    SqlMapClientTemplate template = new SqlMapClientTemplate();
    template.setDataSource(ds);
    template.setSqlMapClient(client);
    template.afterPropertiesSet();
    Object result =
        template.execute(
            new SqlMapClientCallback() {
              public Object doInSqlMapClient(SqlMapExecutor executor) {
                assertTrue(executor == session);
                return "done";
              }
            });
    assertEquals("done", result);
    dsControl.verify();
    conControl.verify();
    sessionControl.verify();
    clientControl.verify();
  }