web-dev-qa-db-ja.com

デバッグ中にメモリ内のhsqldbを検査する

メモリでhdsqldbを使用して、データベースに対して動作するjunitテストを実行しています。 dbは、スプリング構成を介して各テストを実行する前に設定されます。すべて正常に動作します。テストが失敗した場合、メモリ内データベースの値を検査できると便利です。これは可能ですか?もしそうなら?私たちのURLは:

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

各テストの後でデータベースは破棄されます。しかし、デバッガーが実行されているときも、データベースはまだ生きているはずです。私はsqldb databaseManagerに接続してみました。動作しますが、テーブルやデータが表示されません。どんな助けでも大歓迎です!

39
Albert

HSQLはメモリ内にあるため、SQLDBデータベースマネージャーに接続していると言っても、そうではありません。代わりに、SQLDBデータベースマネージャーのメモリ空間にある別のデータベースに接続しています。単体テスト。これが、SQLDBデータベースマネージャーのデータベースが空である理由です。

説明されているようにorg.hsqldb.Serverを使用して、サーバーとしてHSQLを実行できます ここ

org.hsqldb.Serverクラスは通常、別のプロセスを起動するために使用されますが、リモートプロセスがデータベースに接続してクエリを実行できるようにする単体テストでインスタンス化して構成することもできます。

または、必要に応じて、単体テスト内から呼び出されるある種のダンプ機能を記述する必要があります。

余談ですが、単体テストでHSQLを使用することは、実際のデータベースとは異なるHSQLに対してコードが機能することを証明するだけです。つまり、誤検知が発生する可能性があり、その逆も同様です。モックAPIまたはそれ以上で同じことを実現できます。実際のデータベースで機能する適切な統合テストのためにデータベーステストを保存します。

17
Nick Holt

単体テストまたは_@Before_/setUp()メソッドで、次の行を追加してHSQLデータベースマネージャーを起動できます。

_
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"
});
_

DBマネージャーを使用すると、アプリケーションの実行中に、ライブインメモリデータベースでスキーマを検査してSQLクエリを実行できます。

特定の行でデータベースの状態を確認する場合は、ビークポイントを設定するか、何らかの方法で実行を一時停止してください。

69
dimdm

ユニットテストをブレークポイントまで実行し、Eclipseのデバッグパースペクティブで、表示ビュー(ウィンドウ、ビューの表示、表示)を開き、次のように入力します。

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

(dimdmの投稿に従って)、それを強調表示し、右クリックして[実行]を選択します。

enter image description here

15
Gwaptiva

[HSQLDB] [1]に含まれているDatabaseManagerSwingクラスを使用してオープン接続を渡すこともできます。これにより、接続が存在するトランザクションのデータベースの状態を確認できます。

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

上記の受け入れられた回答は、データベース名、ユーザー名、パスワードが変更されていない場合(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を更新する

データベースマネージャーのフリーズに関する問題は、データベースマネージャーを新しいスレッドで起動し、テストが実行されているスレッドをスリープ状態にすることで解決できます。

このコードスニペットをテストに追加すると、デバッグ中にデータベースを検査できます。 database-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
Marius Kohmann