¿Cómo me DBUnit a jugar bien con los tipos de datos de enumeración de MySQL?
Pregunta
Estoy tratando de utilizar DBUnit a prueba algunos de nuestro código de acceso de base de datos y estoy corriendo en un problema. Estamos utilizando MySQL 5 una cosa u otra como base de datos en sí. He exportado un pequeño conjunto de datos a un FlatXmlDataSet y cuando I fijó el caso de prueba, se lanza una excepción que dice "datos truncados para la columna 'FHEIGHT_FLAG' en la fila 1". El FHEIGHT_FLAG columna se define como
enum('t','f') default NULL
La forma en que se han insertado los datos enum a la base de datos, si el valor real de la fuente de los datos no es cierto, entonces la columna contiene en realidad "" (cadena vacía). El código usando la base de datos es sólo hacer la suposición de que si el valor proporcionado por la base de datos no es 't', entonces debe ser falsa. ¿Cómo puedo hacer que esto? No puedo corregir los datos de origen, así que tengo que tratar de hacer algo con el caso de prueba.
Solución
Exportación de un nuevo conjunto de datos, utilizando "select case when FHEIGHT_FLAG = 't' then 't' else 'f' end as FHEIGHT_FLAG, ....(all other columns) .... from tablename";
(Pero ordenar las columnas, ya que están en la mesa real, por supuesto.)
final String select = "select case when FHEIGHT_FLAG = 't' then 't' else 'f' end as FHEIGHT_FLAG, ....(all other columns) .... from tablename";
// database connection
Class driverClass = Class.forName("package.of.jdbcDriver");
Connection jdbcConnection = DriverManager.getConnection(
"jdbc:url:of:db", "user", "pass");
IDatabaseConnection connection = new DatabaseConnection(jdbcConnection);
// partial database export
QueryDataSet partialDataSet = new QueryDataSet(connection);
partialDataSet.addTable("Tablename", select);
FlatXmlDataSet.write(partialDataSet, new FileOutputStream("mydataset.xml"));
Otros consejos
acabé modificando la columna de la base de datos de prueba FHEIGHT_FLAG ser
enum('','t','f') default NULL
de esa manera todos los valores de cadena vacía se permitió que se inserta la espalda.