Проверять в памяти hsqldb при отладке - PullRequest
39 голосов
/ 23 апреля 2010

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

jdbc.url = jdbc: hsqldb: mem: testdb; sql.enforce_strict_size = true

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

Ответы [ 6 ]

67 голосов
/ 19 июня 2010

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


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

или для улучшенной версии Swing


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

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

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

17 голосов
/ 23 апреля 2010

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

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

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

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

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

15 голосов
/ 19 июля 2012

Запустите свой модульный тест до точки останова, затем в перспективе Debug Eclipse откройте представление «Дисплей» («Окно», «Показать представление», «Показать») и введите

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

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

enter image description here

0 голосов
/ 10 июля 2019

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

Добавьте этот фрагмент кода в свой тест, и вы сможете проверить базу данных во время отладки. Не забудьте изменить url-адрес базы данных для вашей базы данных.

Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
                    "--url",  "jdbc:hsqldb:mem://localhost:9001", "--noexit"
            });
        }
    });

t.start();

try {
    Thread.sleep(10000000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
0 голосов
/ 20 марта 2019

Приведенный выше ответ работает отлично, только если имя базы данных, имя пользователя и пароль нетронуты (testdb, SA, пустой пароль).

Для пользовательского имени базы данных, имени пользователя и пароля вы получите следующее исключение

java.sql.SQLInvalidAuthroizationSpecException: неверная спецификация авторизации - не найдено: SA

Затем необходимо подключиться вручную.

Для прямого подключения используйте следующий фрагмент

org.hsqldb.util.DatabaseManager.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:yourdbname", "--noexit",
  "--user", "dbusername", "--password", "dbpassword"
});

или для улучшенной версии Swing

org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:yourdbname", "--noexit",
  "--user", "dbusername", "--password", "dbpassword"
});

Перед выполнениемвышеприведенный фрагмент обновляет следующее

  • yourdbname - обновляет yourdbname реальным именем базы данных
  • dbusername - обновляет dbusername с вашим именем пользователя базы данных
  • dbpassword - обновляет dbpassword вашим паролем базы данных
0 голосов
/ 08 ноября 2017

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

DatabaseManagerSwing manager = new DatabaseManagerSwing();
manager.main();
manager.connect(connection);
manager.start();
...