NoSuchTableException выдается из тестовых случаев dbunit - PullRequest
0 голосов
/ 19 февраля 2009

Я пытаюсь исправить набор тестов в проекте, который я унаследовал от другого программиста для некоторого кода базы данных Java. Сам проект использует hibernate и MySQL для работы с БД, но для целей тестирования используется dbunit. Я могу правильно загрузить и инициализировать фабрику сессий hibernate, но продолжаю получать исключения, когда пытаюсь запустить свои тесты в Eclipse, а именно: "org.dbunit.dataset.NoSuchTableException: mytablename".

Я знаю, что все файлы находятся в нужном месте, и что фактический файл XML, который я передаю в dbunit, в порядке (я использую тип FlatXmlDataSet). Мой метод setUp () в базовом классе теста базы данных выглядит следующим образом:

@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();
}

Сразу после операции базы данных CLEAN_INSERT генерируется исключение с жалобой на последнюю таблицу в моем XML-файле , независимо от того, какая это таблица. Я проверил DTD и XML-схему вручную и с помощью Eclipse, даже приступая к тому, чтобы убедиться, что упорядочение таблиц в двух файлах совпадает. Я бы предпочел не вставлять эти файлы сюда (так как это потребовало бы большого количества замены поиска), но поверьте мне, что я просмотрел примеры dbunit и убедился, что синтаксис совпадает.

Есть идеи, что может быть не так? Я часами гуглю и ничего полезного не могу придумать.

Редактировать: Одна вещь, которую я забыл упомянуть, это то, что когда я помещаю точку останова на строку, которая выдает, я могу просмотреть структуру dataSet и увидеть, что все мои таблицы на самом деле там, а также со всеми данными испытаний. Так что, по крайней мере, эта часть, кажется, работает правильно.

@ Богдан: Хм ... хорошая идея. Я попытаюсь загрузить данные с помощью обычной вставки. @sleske: Тоже хорошее предложение. Спасибо за подсказки; надеюсь, это поможет мне решить эту проблему.

Ответы [ 3 ]

1 голос
/ 19 февраля 2009

Требуется больше информации, чтобы решить эту проблему.

Вы пытались отладить это? Вы можете поместить исходный код DBUnit как отдельный проект в ваше рабочее пространство Eclipse. Затем настройте «путь сборки» вашего теста для использования проекта DBUnit вместо dbunit.jar. Таким образом, вы можете отладить код DBUnit. Тогда, надеюсь, вы поймете, почему это вызывает исключение.

1 голос
/ 24 февраля 2009

Слёске действительно был прав - для решения этой проблемы требовалось гораздо больше информации, а это значит, что я не задавал правильный вопрос. Хотя оба предложения были полезными, мне было бы неприятно отмечать одно как правильный ответ, учитывая, что я не задавал правильный вопрос, поэтому вместо этого я документирую, что я сделал, чтобы это сработало.

В основном, проблема была вызвана другими типами несоответствий схемы. DTD и XML тестовой БД совпали, но DTD больше не соответствовал схеме фактическая , указанной в файлах hbm.xml (то есть, что мы используем в рабочей БД), и тестовой базе данных в XML В файле отсутствовали определенные столбцы, которые позже были помечены как NOT NULL. Кроме того, XML включал таблицы, которые не имели конфигурационных файлов .hbm.xml, так как авторы этого кода никогда не удосужились написать функции, которые будут использовать эти таблицы. Таким образом, даже при том, что они были указаны в DTD, отсутствие соответствующего отображения HBM вызвало проблемы.

Кроме того, мне пришлось переписать код нашего базового класса тестового набора для базы данных, основываясь на том, что я нашел в этом сообщении об использовании вместе hibernate и dbunit .

Наконец, мне нужно было исправить наш процесс сборки, чтобы вместо реальной конфигурации использовался файл "hibernate-test.cfg.xml", а затем все работало нормально. Теперь мне просто нужно выяснить, почему некоторые тестовые примеры выдают исключения. :)

1 голос
/ 19 февраля 2009

DatabaseOperation.CLEAN_INSERT - это комбинация DatabaseOperation.DELETE_ALL и DatabaseOperation.INSERT. Поскольку DatabaseOperation.DELETE_ALL очищает таблицы в обратном порядке, я подозреваю, что это не сбой при очистке последней таблицы, но при очистке первой.

Вы уверены, что таблицы из вашего набора данных действительно существуют в базе данных, которую вы используете при тестировании? Ошибка, которую вы получаете, предполагает, что они этого не делают.

...