Mavenエンタープライズ・アプリケーションのテスト

このチュートリアルでは、NetBeans IDEとMaven原型を使用した単純なエンタープライズ・アプリケーションをテストする方法を示します。このチュートリアルでは、エンティティ・クラスとセッションBeanを含むエンタープライズ・アプリケーションを作成します。ウィザードを使用してBeanクラス用の単純なテスト・クラスを作成してから、IDEでそのテストを実行します。このテスト・クラスは、GlassFish埋込みEJBコンテナのインスタンスを作成し、データベースへの接続をテストします。

チュートリアルの課題

このページの内容は、NetBeans IDE 7.1に適用されます

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 7.1、Java EEバンドル版
Java Development Kit (JDK) バージョン6またはバージョン7
GlassFish Server Open Source Edition 3.1.1

注意:GlassFish Server 3.1.1のインストーラは、Java EEバンドル版をダウンロードした場合に含まれています。NetBeans IDEのインストール処理の一部としてGlassFishをインストールおよび登録できます。

前提条件

このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。

  • Javaプログラミング
  • NetBeans IDE

このチュートリアルを開始する前に、必要に応じて次のドキュメントをお読みください。

IDEでのMavenの使用

NetBeans IDEには、Mavenのサポートが完全に統合されています。Mavenフレームワークを使用するプロジェクト開発は、Antでのプロジェクト開発とほぼ同じです。ただし、Mavenによるプロジェクトのビルド方法および依存性の処理方法には、いくつかの違いがあります。次のヒントは、Mavenアプリケーションを初めて作成する場合に発生するいくつかの問題を回避するのに役立ちます。

Mavenの設定の確認

これが初めてのMavenプロジェクトである場合は、「オプション」ウィンドウでMavenの構成設定を確認します。このチュートリアルを完了するには、ローカル・システムにMavenがインストールされている必要があります。NetBeans IDE 7.0以降では、MavenはIDEにバンドルされており、IDEをインストールするときにインストールされます。以前のバージョンのIDEを使用している場合は、Mavenのサイトからインストーラをダウンロードできます。

  1. IDEで「オプション」ウィンドウを開きます。
  2. 「オプション」ウィンドウの「その他」カテゴリを選択して、「Maven」タブをクリックします。
  3. 「Mavenのホーム」が指定されていることを確認します。

    IDEにバンドルされているMavenバージョンを使用することも、ローカルのMavenインストール(2.0.9以降が必要)の場所を指定することもできます。

  4. ローカルMavenリポジトリの場所が正しいことを確認します。
  5. 「OK」をクリックして「オプション」ウィンドウを閉じます。

注意:以前にIDEでMavenプロジェクトを作成したことがない場合は、最初にIDEでMavenモジュールをアクティブ化する必要があります。これは、新規プロジェクト・ウィザードでMavenプロジェクトの原型を選択することによって実行できます。原型を選択すると、IDEによって、このモジュールが自動的にアクティブ化されます。IDEでMavenをアクティブ化するために、このウィザードを終了する必要はありません。

Mavenリポジトリの更新

ローカルおよびリモートのMavenリポジトリは、コード補完およびプロジェクトのビルド時に使用されます。プロジェクトの開発時に、必要な任意のアーティファクトをすぐに使用できるように、Mavenリモート・リポジトリの索引を更新しておきます。「オプション」ウィンドウの「Maven」タブでは、IDEが更新を確認する頻度を構成できます。Mavenリポジトリ・ブラウザでは、更新の有無を即時確認でき、ローカルおよびリモートのMavenリポジトリを調べることができます。

  1. 「ウィンドウ」>「その他」>「Mavenリポジトリ・ブラウザ」を選択します。
  2. 「Mavenリポジトリ・ブラウザ」ウィンドウの上部にある索引を更新(索引を更新ボタン)をクリックします。

「索引を更新」をクリックすると、各Mavenリモート・リポジトリの最新の索引の有無が確認され、ダウンロードされます。索引は、リポジトリ内に存在するアーティファクトの現在の状態を示し、アプリケーションで使用できるアーティファクトへの参照を提供するために使用されます。デフォルトでは、アーティファクトが明示的に要求されないかぎり、リポジトリからアーティファクトはダウンロードされません。

注意:索引のサイズが非常に大きく、すべてを更新するのに時間がかかる可能性があります。

NetBeans IDEでのMavenの使用に関する詳細は、Hibernateを使用したMaven Swingアプリケーションの作成チュートリアルのMavenの構成の項およびNetBeans IDEでのApache Mavenのベスト・プラクティスを参照してください。

エンタープライズ・アプリケーションの作成

この項では、エンティティ・クラスとそのエンティティ・クラスにアクセスするセッションBeanを含む単純なWebアプリケーションを作成します。

Webプロジェクトの作成

この課題では、新規プロジェクト・ウィザードを使用して、Maven原型からJava EE 6 Webアプリケーションを作成します。ウィザードを使用してプロジェクトを作成するときは、ターゲット・サーバーとしてGlassFish Server 3.1.1を指定します。

  1. メイン・メニューから「ファイル」>「新規プロジェクト」([Ctrl]-[Shift]-[N]、Macの場合は[⌘]-[Shift]-[N])を選択して新規プロジェクト・ウィザードを開きます。
  2. 「Maven」カテゴリから「Webアプリケーション」を選択します。「次」をクリックします。
  3. プロジェクト名をmavenwebtestappにし、プロジェクトの場所を設定します。「次」をクリックします。
  4. 「サーバー」ドロップダウン・リストで「GlassFish Server 3.1.1」を選択します。
  5. 「Java EEバージョン」ドロップダウン・リストで「Java EE 6 Web」を選択します。「終了」をクリックします。

「終了」をクリックすると、IDEによってWebアプリケーションが作成され、プロジェクトが「プロジェクト」ウィンドウで開きます。

生成されたプロジェクトを示す「プロジェクト」ウィンドウ

「プロジェクト」ウィンドウでプロジェクト・ノードを展開すると、javaee-web-api-6.0 JARがプロジェクトの依存性として一覧表示され、JDK 1.6がJava依存性として一覧表示されていることがわかります。IDEによってプロジェクトのPOM (pom.xml)が生成され、そのファイルが「プロジェクト・ファイル」ノードの下に一覧表示されます。

エンティティ・クラスの作成

この課題では、新規ファイル・ウィザードを使用してエンティティ・クラスを作成します。エンティティ・クラスを作成するときは、ウィザードでjdbc/sampleデータ・ソースを選択します。サーバーのインストール時にjdbc/sampleデータ・ソースが登録されたため、新しいデータ・ソースを作成または登録する必要はありません。

注意:新しいデータソースを作成したり、異なるデータソースを使用する場合は、埋込みコンテナを使用してアプリケーションをテストする前に、そのデータソースをサーバーに登録する必要があります。埋込みコンテナを使用してアプリケーションをテストするときは、GlassFishサーバー・インスタンスにデプロイするときと同じように、データ・ソースがIDEによって自動的には登録されません。

  1. プロジェクト・ノードを右クリックし、「新規」>「エンティティ・クラス」を選択します。

    または、メイン・メニューから「ファイル」>「新規ファイル」([Ctrl]-[N]、Macの場合は[⌘]-[N])を選択し、「持続性」カテゴリで「エンティティ・クラス」を選択することもできます。

  2. 「クラス名」に「MyEntity」と入力します。
  3. 「パッケージ」として「com.mycompany.mavenwebtestapp」を選択し、「主キー型」をintに設定します。
  4. 「持続性ユニットを作成」が選択されていることを確認します。「次」をクリックします。
  5. 「データ・ソース」ドロップダウン・リストで「jdbc/sample」を選択します。
  6. 「Java Transaction APIを使用」が選択されていることを確認し、「表生成の方針」として「ドロップして作成」を選択します。「終了」をクリックします。
    生成されたプロジェクトを示す「プロジェクト」ウィンドウ

    「終了」をクリックすると、IDEによってMyEntityクラスが生成され、ソース・エディタでクラスが開かれます。IDEによって、依存性としてeclipselink-2.3.0javax.persistence-2.0.3およびorg.eclipse.persistence.jpa.modelgen.processor-2.3.0アーティファクトが追加されます。

  7. ソース・エディタで、クラスにprivateフィールドnameを追加します。
    private String name;
  8. エディタ内を右クリックし、「コードを挿入」ポップアップ・メニューで「取得メソッドおよび設定メソッド」を選択してnameフィールドの取得メソッドと設定メソッドを生成します。
  9. 以下のメソッドを追加します。
    public MyEntity(int id) {
        this.id = id;
        name = "Entity number " + id + " created at " + new Date();
    }
  10. MyEntity表のすべてのレコードを検索する名前付きSQL問合せを作成するために、以下の@NamedQueriesおよび@NamedQuery注釈(太字部分)を追加します。
    @Entity
    @NamedQueries({
        @NamedQuery(name = "MyEntity.findAll", query = "select e from MyEntity e")})
    public class MyEntity implements Serializable {

  11. クラス宣言の左マージンにあるヒントをクリックして、「デフォルト・コンストラクタを作成」ヒントを選択します。
    生成されたプロジェクトを示す「プロジェクト」ウィンドウ
  12. インポート文を修正([Ctrl]-[Shift]-[I]、Macの場合は[⌘]-[Shift]-[I])して、javax.persistence.NamedQueryjavax.persistence.NamedQueriesおよびjava.util.Dateのインポート文を追加します。変更を保存します。

セッションBeanの作成

この課題では、ウィザードを使用してMyEntityエンティティ・クラスのセッション・ファサードを作成します。ウィザードを使用してファサードを生成すると、エンティティ・クラスにアクセスするときによく使用されるcreatefindなどのいくつかのメソッドを含む抽象ファサードもIDEによって生成されます。次に、ファサードに2つのメソッドを追加します。

  1. プロジェクト・ノードを右クリックし、「新規」>「その他」を選択します。

    または、メイン・メニューから「ファイル」>「新規ファイル」([Ctrl]-[N]、Macの場合は[⌘]-[N])を選択して新規ファイル・ウィザードを開きます。

  2. 「エンタープライズJavaBeans」カテゴリで「エンティティ・クラスのセッションBean」を選択します。「次」をクリックします。
  3. 「利用可能なエンティティ・クラス」のリストからMyEntityクラスを選択し、「追加」をクリックします。「次」をクリックします。
  4. ウィザードの「生成されるセッションBean」パネルで、デフォルトのプロパティを使用します。「終了」をクリックします。

    「終了」をクリックすると、IDEによってcom.mycompany.mavenwebtestappパッケージ内にAbstractFacade.javaMyEntityFacade.javaが生成され、ソース・エディタでこれらのクラスが開きます。

    ソース・エディタで、IDEによってEntityManagerのコードが生成され、持続性ユニットを指定するために@PersistenceContext注釈が追加されたことを確認できます。

    @Stateless
    public class MyEntityFacade extends AbstractFacade<MyEntity> {
        @PersistenceContext(unitName = "com.mycompany_mavenwebtestapp_war_1.0-SNAPSHOTPU")
        private EntityManager em;
    
        @Override
        protected EntityManager getEntityManager() {
            return em;
        }
    
        public MyEntityFacade() {
            super(MyEntity.class);
        }
        
    }
  5. MyEntity.javaに以下のメソッドを追加します。
        @PermitAll
        public int verify() {
            String result = null;
            Query q = em.createNamedQuery("MyEntity.findAll");
            Collection entities = q.getResultList();
            int s = entities.size();
            for (Object o : entities) {
                MyEntity se = (MyEntity) o;
                System.out.println("Found: " + se.getName());
            }
    
            return s;
        }
    
        @PermitAll
        public void insert(int num) {
            for (int i = 1; i <= num; i++) {
                System.out.println("Inserting # " + i);
                MyEntity e = new MyEntity(i);
                em.persist(e);
            }
        }
  6. インポートを修正して必要なインポート文を追加します。変更を保存します。
    生成されたプロジェクトを示す「プロジェクト」ウィンドウ

    注意:「すべてのインポートを修正」ダイアログ・ボックスでjavax.persistence.Queryが選択されていることを確認してください。

セッションBeanテストの作成

この項では、MyEntityFacadeセッション・ファサード用のJUnitテスト・クラスを作成します。IDEによって、ファサード・クラス内の各メソッドおよび抽象ファサード内の各メソッド用のスケルトン・テスト・メソッドが生成されます。抽象ファサード内のメソッド用に生成されたテスト・メソッドに注釈を付けて、IDEとJUnitテスト・ランナーにそれらを無視するように指示します。次に、MyEntityFacadeに追加したverifyメソッド用のテスト・メソッドを変更します。

生成されたテストで、EJBコンテナのインスタンスを作成するためにEJBContainerをコールするコードがIDEによって自動的に追加されることを確認します。テスト・クラスが生成されると、コールが含まれている行の左マージンに、Java EE APIがクラスパスにないことを示すヒントと、GlassFish Server 3.1のインストールからEJBContainerを使用することを薦める提案が示されます。このヒントにより、POMを変更し、GlassFishのローカル・インストールへのパスを指定するプロパティを追加します。

  1. 「プロジェクト」ウィンドウでMyEntityFacade.javaを右クリックし、「ツール」>「JUnitテストを作成」を選択します。
  2. JUnitのバージョンとして「JUnit 4.x」を選択します。「選択」をクリックします。
  3. 「テストを作成」ダイアログ・ボックスのデフォルトのオプションを使用します。「OK」をクリックします。

    デフォルトでは、IDEによってMyEntityFacadeおよびAbstractFacade内の各メソッド用のテストを含むスケルトン・テスト・クラスが生成されます。IDEによってJUnit 4.10への依存性がPOMに自動的に追加されます。

  4. testVerifyを除く各テスト・メソッドに@Ignore注釈を付けます。テストを実行すると、IDEによって@Ignore注釈の付いた各テストがスキップされます。

    または、testVerify以外のすべてのテスト・メソッドを削除することもできます。

  5. テスト・クラス内のtestVerifyテスト・メソッドを見つけます。

    EJBContainerをコールする行の左マージンにエラー注釈があることを確認できます。

        @Test
        public void testVerify() throws Exception {
            System.out.println("verify");
            EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
            MyEntityFacade instance = (MyEntityFacade)container.getContext().lookup("java:global/classes/MyEntityFacade");
            int expResult = 0;
            int result = instance.verify();
            assertEquals(expResult, result);
            container.close();
            // TODO review the generated test code and remove the default call to fail.
            fail("The test case is a prototype.");
        }
  6. マージンのエラー注釈をクリックし、ポップアップ・メニュー内の提案から「GlassFish Server 3.1.1のインストールからEJBContainerを使用」を選択します。

    または、エラーが発生した行に挿入カーソルを置き、[Alt]+[Return]を押してポップアップ・メニュー内の提案を選択することもできます。

    EJBContainerの場所を指定するエディタ・ヒントを示すスクリーンショット

    提案を選択すると、IDEによってPOM内の<properties>要素に<glassfish.embedded-static-shell.jar>要素(太字部分)が追加されます。<glassfish.embedded-static-shell.jar>要素は、ローカルのGlassFishサーバー・インストールへのパスを識別するために使用されます。ローカル・インストールへのパスが変更された場合は、POM内のこの要素を変更する必要があります。

        <properties>
            <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <glassfish.embedded-static-shell.jar>/Applications/NetBeans/glassfish-3.1.1/glassfish/lib/embedded/glassfish-embedded-static-shell.jar</glassfish.embedded-static-shell.jar>
    
        </properties>
                    

    また、ローカル・インストールへのパスを参照するglassfish-embedded-static-shellへの依存性もIDEによってPOMに追加されます。

            <dependency>
                <groupId>org.glassfish.extras</groupId>
                <artifactId>glassfish-embedded-static-shell</artifactId>
                <version>3.1.1</version>
                <scope>system</scope>
                <systemPath>${glassfish.embedded-static-shell.jar}</systemPath>
            </dependency>
                    
  7. testVerifyテスト・メソッドのスケルトンに以下の変更(太字部分)を加えます。
    @Test
    public void testVerify() throws Exception {
        System.out.println("verify");
        EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
        MyEntityFacade instance = (MyEntityFacade)container.getContext().lookup("java:global/classes/MyEntityFacade");
        System.out.println("Inserting entities...");
        instance.insert(5);
        int result = instance.verify();
        System.out.println("JPA call returned: " + result);
        System.out.println("Done calling EJB");
        Assert.assertTrue("Unexpected number of entities", (result == 5));
        container.close();
    }
  8. インポート文を修正してjunit.framework.Assertを追加します。変更を保存します。
  9. 「プロジェクト」ウィンドウでプロジェクト・ノードを右クリックし、「テスト」を選択します。

「テスト」を選択すると、IDEによってアプリケーションがビルドされ、ビルド・ライフサイクルのテスト・フェーズが実行されます。この単体テストは、JUnit 4.xテストの実行をサポートするsurefireプラグインを使用して実行されます。surefireプラグインの詳細は、http://maven.apache.org/plugins/maven-surefire-plugin/を参照してください。

テストの結果が「テスト結果」ウィンドウに表示されます。

この例では、9個のテストに成功したことがわかります。「出力」ウィンドウを見ると、1個のテストのみが実行され、8個のテストがスキップされたことを確認できます。

Running com.mycompany.mavenwebtestapp.MyEntityFacadeTest
verify
...
Inserting entities...
Inserting # 1
Inserting # 2
Inserting # 3
Inserting # 4
Inserting # 5
Found: Entity number 2 created at Fri Feb 25 18:26:53 CET 2011
Found: Entity number 4 created at Fri Feb 25 18:26:53 CET 2011
Found: Entity number 3 created at Fri Feb 25 18:26:53 CET 2011
Found: Entity number 1 created at Fri Feb 25 18:26:53 CET 2011
Found: Entity number 5 created at Fri Feb 25 18:26:53 CET 2011
JPA call returned: 5
Done calling EJB
...

Results :

Tests run: 9, Failures: 0, Errors: 0, Skipped: 8


関連項目

NetBeans IDEを使用したJava EEアプリケーションの開発方法の詳細は、次のリソースを参照してください。

エンタープライズBeanの使用方法については、Java EE 6チュートリアルを参照してください。

nbj2eeメーリング・リストに登録することによって、NetBeans IDE Java EE開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2015, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo