home

Extending Spring's JdbcTestUtilsTests

23 Mar 2009

SPR-4545 suggests an extension of JdbcTestUtilsTests to add two simple JDBC-based queryRow() methods, which can be used to test other database functionality, such as Hibernate code.

public class JdbcTestUtilsTests extends TestCase {

  // . . .

  public Map queryRow(String tableName, String keyName, Object keyValue) {
    Map keys = new HashMap();
    keys.put(keyName, keyValue);
    return this.queryRow(tableName, keys);
  }

  public Map queryRow(String tableName, final Map keys) {
    StringBuffer keyNamesStringBuffer = new StringBuffer();
    for (Object key : keys.keySet()) {
      if (keyNamesStringBuffer.length() > 0) {
        keyNamesStringBuffer.append(" ,");
      }
      keyNamesStringBuffer.append(key);
    }

    StringBuffer queryStringBuffer = new StringBuffer();
    queryStringBuffer.append("select ");
    queryStringBuffer.append(keyNamesStringBuffer);
    queryStringBuffer.append(" from ");
    queryStringBuffer.append(tableName);
    queryStringBuffer.append(" where ");

    StringBuffer keyValuesStringBuffer = new StringBuffer();
    for (Object key : keys.keySet()) {
      if (keyValuesStringBuffer.length() > 0) {
        keyValuesStringBuffer.append(" and");
      }
      keyValuesStringBuffer.append(key);
      keyValuesStringBuffer.append(" = ? ");
    }

    queryStringBuffer.append(keyValuesStringBuffer);

    return (Map) jdbcTemplate.queryForObject(queryStringBuffer.toString(),
        keys.values().toArray(), new RowMapper() {
          public Object mapRow(ResultSet resultSet, int rowNum)
              throws SQLException {
            Map rowMap = new HashMap();
            for (Object key : keys.keySet()) {
              rowMap.put(key, resultSet.getObject((String) key));
            }

            return rowMap;
          }
        });
  }
}

Including the updated JdbcTestUtilsTests with the prior project, Database Access with Hibernate and Spring, and updating HibernateDaoTest, the new queryRow() functionality can be easily tested and used to validate the data access code developed in that project.

public class HibernateDaoTest extends JdbcTestUtilsTests {

  // . . .

  @Test
  public void testSaveGet() throws Exception {

    TestIdentifiable testIdentifiable = hibernateDao.get(
        TestIdentifiable.class, "test identifiable 5");

    TestCase.assertNotNull(testIdentifiable);
    TestCase.assertEquals(testIdentifiable.getId(), "test identifiable 5");

    hibernateDao.flush();

    Map map = queryRow("TestIdentifiable", "id", "test identifiable 5");

    assertEquals(1, map.keySet().size());
    assertEquals("test identifiable 5", map.get("id"));
  }

  @Autowired
  public void setDataSource(DataSource dataSource) {
    setJdbcTemplate(new JdbcTemplate(dataSource));
  }
}

The new queryRow() functionality retrieves a simple Map containing the specified key/value pair of id/test identifiable 5, validating the successful functionality of the Hibernate code.