0

JSFページを含むmaven WARパッケージがあります。通常、私は使用します

@Resource(name = "jdbc/Oracle")
    private DataSource ds;

GlassfishサーバーにWARパッケージをデプロイするときにデータベースを呼び出す。しかし、netbeans を使用してラップトップでパッケージをビルドするときの JUnit テストの場合、このデータソースを使用できません。どうすればこの問題を解決できますか? パッケージをビルドした直後にデータベース テーブルを使用して JUnit テストを実行したいのですが、データソースがありません。可能な解決策は何ですか?

4

2 に答える 2

4

実際にデータベースに対して単体テストを実行しますか?個人的には、これを避けようとします。これは、通常、テストがデータベースの状態に密接に関連しており、「ユニット」と処理したいすべての可能な状態を実際にテストできないことが多いためです。また、単体テストの実行に時間がかかる可能性がありますが、これは理想的ではありません。

別の方法は、 EasyMockMockitoDataSourceなどを使用してモックを作成することです。または、多くのテストで共通の動作を定義したい場合は、インターフェイスの独自のモック実装を作成することもできます。DataSourceDataSources

本当にデータベースを使用したい場合は、使用している実装DataSource(たとえばOracleDataSource)を手動でインスタンス化してから、これをクラスで使用することを検討する必要があります。

いずれの場合も、テストしているインスタンスでの設定を少し簡単にするために、コンストラクターまたはメソッドインジェクションの使用に切り替える必要があります。DataSource(それ以外の場合は、リフレクションを使用してプライベート変数を設定する必要があります。)

たとえば、クラスは次のようになります。

public class DatabaseOperations {
    private DataSource dataSource;

    @Resource(name = "jdbc/Oracle")
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
}

そして、テストは次のようになります。

public class DatabaseOperationsTest {
    public void testSomeOperation() {
        DatabaseOperations databaseOperations = new DatabaseOperations();
        databaseOperations.setDataSource(new MockDataSource());
    }
}
于 2013-02-18T23:29:28.903 に答える
1

注入された DataSource を使用してテストを実行する必要が本当にある場合は、デプロイ ユニットを作成する Arquillian を使用することを検討できます。必要に応じて、特にテスト用に構成された DataSource と共に、embedeed またはリモートの Glassfish コンテナーにデプロイします。この特定のシナリオのガイドがあります。

利点は、CDI を備えた本格的なコンテナーを使用できることです。パッケージを取得するものを制御して、CDI クラスのテスト スタブを提供できるようにします。また、展開構成 (テスト構成と本番構成) を制御することもできます。非侵襲的です。

于 2013-02-19T02:37:32.190 に答える