2010-04-23 4 views
36

Мы используем hdsqldb в памяти для запуска тестов junit, которые работают с базой данных. Перед запуском каждого теста через конфигурацию пружины устанавливается db. Все работает нормально. Теперь, когда тесты терпят неудачу, может быть удобно проверять значения в базе данных памяти. Это возможно? Если да, то как? Наш URL является:Осмотр памяти hsqldb при отладке

jdbc.url = JDBC: HSQLDB: мем: TESTDB; sql.enforce_strict_size = истина

база данных уничтожается после каждого испытания. Но когда работает отладчик, база данных также должна оставаться в живых. Я попытался подключиться к sqlb databaseManager. Это работает, но я не вижу никаких таблиц или данных. Любая помощь высоко ценится!

ответ

16

HSQL находится в памяти, поэтому, когда вы говорите, что подключаетесь к SQLDB Database Manager, вы не являетесь - вы вместо этого подключаетесь к другой базе данных в пространстве памяти SQLDB Database Manager, а не в памяти в модульном тесте. Вот почему база данных в SQLDB Database Manager пуста.

Вы можете запустить HSQL в качестве сервера, используя org.hsqldb.Server, как описано here.

Хотя класс org.hsqldb.Server обычно используется для запуска отдельного процесса, его можно создать и настроить в своем модульном тесте, что должно позволить удаленному процессу подключаться и запрашивать базу данных.

В качестве альтернативы вам потребуется написать какую-то функцию дампа, которая вызывается из вашего модульного теста по мере необходимости.

Как в стороне, использование HSQL в модульных тестах просто доказывает, что ваш код работает против HSQL, который отличается от фактической базы данных. Это означает, что вы можете получить ложные срабатывания и наоборот. То же самое можно достичь с помощью насмешливого API или лучше, сохраните тестирование базы данных для некоторых достойных тестов интеграции, которые работают с реальной базой данных.

+1

Спасибо за ваш ответ! Я понял это, и он работает, если у вас есть hsqldb для записи в файл и используйте этот url для подключения к нему. Я использовал старый драйвер, который был на моем пути. Я согласен с тем, что вы также должны протестировать его против реальной базы данных, которую мы также делаем, но наличие запросов sql, проверенных, более ценно, а затем издеваться над ним, я бы сказал. – Albert

66

В тестовом модуле или в методе @Before/setUp(), вы можете добавить следующую строку для запуска HSQL менеджер баз данных:


org.hsqldb.util.DatabaseManager.main(new String[] { 
    "--url", "jdbc:hsqldb:mem:testdb", "--noexit" 
}); 

или улучшенной версии свинг


org.hsqldb.util.DatabaseManagerSwing.main(new String[] { 
    "--url", "jdbc:hsqldb:mem:testdb", "--noexit" 
}); 

Менеджер базы данных позволяет проверять вашу схему и запускать SQL-запросы в базе данных в реальном времени во время работы приложения.

Обязательно установите контрольную точку или приостановите выполнение так или иначе, если вы хотите проверить состояние своей базы данных на определенной строке.

+0

Обратите внимание, что я пропустил часть «sql.enforce_strict_size = true» URL-адреса JDBC, я не уверен, какой эффект будет здесь ... – dimdm

+4

Когда я делаю так, как вы предложили запустить DatabaseManager, но зависает. Я ничего не могу с этим поделать. Если я отключаю его, сеанс отладки также умирает. Я использую Intellij Idea 11.1.2. –

+2

См. Здесь (http://stackoverflow.com/questions/11435654/connect-to-in-memory-hsql-hypersonic-database-with-databasemanager-while-debug/11437102#11437102) для обсуждения того, как сохранить DatabaseManager от замораживания. –

13

Запустите модульное тестирование на контрольную точку, то в перспективе Debug Затмения, откройте вид дисплея (Window, Show View, Display) и введите

org.hsqldb.util.DatabaseManagerSwing.main(new String[] { 
    "--url", "jdbc:hsqldb:mem:testdb", "--noexit" 
}); 

(согласно сообщению dimdm в), выделите его , щелкните правой кнопкой мыши и выберите «Выполнить».

+0

Менеджер базы данных HSQL зависает при выполнении SQL, как сообщение @dimdms. – yellavon

+1

@yellavon сконфигурируйте вашу точку останова в IDE, чтобы не замерзать все темы – deFreitas

0

Вы также можете использовать класс DatabaseManagerSwing, включенный в [HSQLDB] [1], передавая ему открытое соединение, которое позволяет вам видеть состояние базы данных в транзакции, в которой находится соединение.

DatabaseManagerSwing manager = new DatabaseManagerSwing(); 
manager.main(); 
manager.connect(connection); 
manager.start(); 
Смежные вопросы