Pregunta

Estoy intentando fijar el conjunto de pruebas en un proyecto que he heredado de otro programador para algunos códigos de la base de Java. El proyecto en sí está usando Hibernate y MySQL para la materia de base de datos, pero para los propósitos de los casos de prueba DBUnit se está utilizando. Puedo cargar e inicializar correctamente fábrica de sesiones de hibernación, pero me siguen dando excepciones cuando trato de ejecutar mis pruebas en Eclipse, a saber "org.dbunit.dataset.NoSuchTableException: MyTableName"

Sé que todos los archivos están en el lugar correcto, y que el archivo XML real que estoy pasando en DBUnit está bien (estoy usando el tipo FlatXmlDataSet). Mi método de Configuración () en la clase base de base de datos de casos de prueba es el siguiente:

@Override
protected void setUp() throws Exception {
    super.setUp();
    IDataSet dataSet = new FlatXmlDataSet(new File(mDataFile));

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();

    IDatabaseConnection connection = new DatabaseConnection(session.connection());

    DatabaseConfig config = connection.getConfig();
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());

    DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);

    session.getTransaction().commit();
}

Justo después de la operación de la base de datos CLEAN_INSERT, la excepción es lanzada quejándose de la última mesa en mi archivo XML , independientemente de qué tabla es esto. He verificado el esquema DTD y XML a mano y con Eclipse, incluso llegando al punto de asegurarse de que el orden de las tablas en los dos archivos coincidentes. Yo prefiero no pegar los archivos aquí (ya que implicaría una gran cantidad de buscar-reemplazar), pero confía en mí que he mirado a través de ejemplos DBUnit y se aseguró de que los partidos de sintaxis.

¿Alguna idea sobre lo que podría estar mal? He estado buscando en Google durante horas y no puedo pensar en nada útil.

Editar Una cosa que me olvidé de mencionar, es que cuando coloco un punto de interrupción en la línea de lo que arroja, puedo mirar a través de la estructura del conjunto de datos y ver que todos mis cuadros son en realidad allí, junto con todos los datos de prueba. Así que al menos esa parte parece estar funcionando correctamente.

@Bogdan: Gestión de recursos humanos ... buena idea. Voy a tratar de cargar los datos con una inserción regular. @sleske: También una buena sugerencia. Gracias por los consejos; espero que esto me va a establecer en el camino correcto para solucionar este problema.

¿Fue útil?

Solución 3

sleske era de hecho la derecha - se necesita mucha más información para resolver este problema, lo que significa que no estaba pidiendo la pregunta correcta. Aunque ambas sugerencias aquí eran útiles, me siento una marca como la respuesta correcta, dado que no estaba haciendo la pregunta correcta malo, así que en vez voy a documentar aquí lo que hice para conseguir este trabajo.

Básicamente, el problema fue causado por otros tipos de desajustes de esquema. La prueba de DB DTD y XML emparejados, pero el DTD ya no se correspondía con el real esquema que aparece en los archivos de hbm.xml (es decir, lo que estamos utilizando en la producción DB), y la base de datos de prueba en el archivo XML faltaba ciertas columnas que luego fueron marcadas como NOT NULL. Además, el XML incluye tablas que no tienen .hbm.xml archivos de configuración, como los autores originales de este código nunca llegó a escribir las funciones que se usan estas tablas. Así que a pesar de que se especificaron en el DTD, la ausencia de una asignación de HBM correspondiente causó problemas.

Además, tuve que volver a escribir algunos de nuestro código de clase base de caso de prueba de base de datos basada en lo que he encontrado en este blog post sobre el uso de hibernación y DBUnit juntos .

Por último, tenía que arreglar nuestro proceso de construcción de manera que un archivo "hibernar-test.cfg.xml" se utiliza en lugar de la configuración real, y entonces todo funcionaba bien. Ahora sólo tengo que averiguar por qué algunos de los casos de prueba están lanzando excepciones. :)

Otros consejos

El DatabaseOperation.CLEAN_INSERT es esencialmente una combinación de DatabaseOperation.DELETE_ALL y DatabaseOperation.INSERT. Desde el DatabaseOperation.DELETE_ALL borra las tablas en orden inverso, sospecho que no falla al despejar la última mesa, pero cuando la limpieza de la primera.

¿Está seguro de que existen las tablas a partir de los datos que figuran en realidad en la base de datos que está utilizando durante la prueba? El error que está recibiendo sugeriría que no lo hacen.

Se necesita más información para resolver esto.

¿Ha tratado de depurar este? Se puede poner el código fuente de DBUnit como un proyecto separat al espacio de trabajo de Eclipse. A continuación, configure "trayectoria de la estructura" de su prueba a utilizar el proyecto DBUnit en lugar de un dbunit.jar. De esa manera usted puede depurar en el código de DBUnit. A continuación, te esperamos ver por qué se produce una excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top