// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Mavenエンタープライズ・アプリケーションのテスト
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Mavenエンタープライズ・アプリケーションのテスト - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Mavenエンタープライズ・アプリケーションのテスト

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

NOTE: GlassFish 3.1.xを使用する場合、link:../../73/javaee/maven-entapp-testing.html[+組込みGlassFish Server 3.1を使用したMavenエンタープライズ・アプリケーションのテスト+]を参照してください。

*チュートリアルの課題*

* <<intro,IDEでのMavenの使用>>
* <<Exercise_1,エンタープライズ・アプリケーションの作成>>
* <<Exercise_1a,Webプロジェクトの作成>>
* <<Exercise_1b,エンティティ・クラスの作成>>
* <<Exercise_1c,セッションBeanの作成>>
* <<Exercise_2,セッションBeanテストの作成>>

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

|===
|ソフトウェアまたはリソース |必須バージョン 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |7.4、8.0、Java EEバンドル版 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Java Development Kit (JDK)+] |バージョン7または8 

|GlassFish Server Open Source Edition |4.0 
|===

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

*前提条件*

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

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

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

* link:http://wiki.netbeans.org/MavenBestPractices[+NetBeans IDEでのApache Mavenのベスト・プラクティス+]
* link:http://books.sonatype.com/mvnref-book/reference/introduction.html[+Chapter 1. Introducing Apache Maven+] (link:http://books.sonatype.com/mvnref-book/reference/index.html[+Maven: The Complete Reference +])


== IDEでのMavenの使用

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

*Mavenの設定の確認*

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

1. IDEで「オプション」ウィンドウを開きます(「ツール」→「オプション」、Macの場合は「NetBeans」→プリファレンス)。
2. 「オプション」ウィンドウで「Java」カテゴリを選択し、「Maven」タブをクリックします。
3. 「Mavenのホーム」が指定されていることを確認します。

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


[start=4]
. 「OK」をクリックして「オプション」ウィンドウを閉じます。

NOTE: Mavenサポートは、IDEでJavaが有効になっている場合に自動的に有効になります。Java EEプラグインが有効になっていない場合は、有効にする必要があります。

*Mavenリポジトリの更新*

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

1. 「ウィンドウ」>「サービス」を選択し、「サービス」ウィンドウを開きます。
2. 「サービス」ウィンドウで「Mavenリポジトリ」ノードを展開します。
3. リポジトリ・ノードを右クリックし、ポップアップ・メニューで「索引の更新」を選択します。

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

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

NetBeans IDEでのMavenの使用に関する詳細は、link:https://netbeans.org/kb/docs/java/maven-hib-java-se.html[+Hibernateを使用したMaven Swingアプリケーションの作成+]チュートリアルのlink:https://netbeans.org/kb/docs/java/maven-hib-java-se.html#02[+Mavenの構成+]の項およびlink:http://wiki.netbeans.org/MavenBestPractices[+NetBeans IDEでのApache Mavenのベスト・プラクティス+]を参照してください。


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

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


=== Webプロジェクトの作成

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

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

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

image::images/maven-testing-projects.png[title="生成されたプロジェクトを示す「プロジェクト」ウィンドウ"]

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


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

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

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

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

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


[start=2]
. 「クラス名」に「*MyEntity*」と入力します。

[start=3]
. 「パッケージ」として「 ``com.mycompany.mavenwebtestapp`` 」を選択し、「主キー型」を* ``int`` *に設定します。

[start=4]
. 「持続性ユニットを作成」が選択されていることを確認します。「次」をクリックします。

[start=5]
. 「データ・ソース」ドロップダウン・リストで「*jdbc/sample*」を選択します。

[start=6]
. 「Java Transaction APIを使用」が選択されていることを確認し、「表生成戦略」として「ドロップして作成」を選択します。「終了」をクリックします。

image::images/maven-testing-pu.png[title="生成されたプロジェクトを示す「プロジェクト」ウィンドウ"]

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


[start=7]
. ソース・エディタで、クラスにprivateフィールド ``name`` を追加します。

[source,java]
----

private String name;
----

[start=8]
. エディタ内を右クリックし、「コードを挿入」ポップアップ・メニューで「取得メソッドおよび設定メソッド」を選択して ``name`` フィールドの取得メソッドと設定メソッドを生成します。

[start=9]
. 次のコンストラクタを追加します。

[source,java]
----

public MyEntity(int id) {
    this.id = id;
    name = "Entity number " + id + " created at " + new Date();
}
----

[start=10]
. MyEntity表のすべてのレコードを検索する名前付きSQL問合せを作成するために、以下の ``@NamedQueries`` および ``@NamedQuery`` 注釈(太字部分)を追加します。

[source,java]
----

@Entity
*@NamedQueries({
    @NamedQuery(name = "MyEntity.findAll", query = "select e from MyEntity e")})*
public class MyEntity implements Serializable {
----


[start=11]
. クラス宣言の左マージンにあるヒントをクリックして、「*デフォルト・コンストラクタを作成*」ヒントを選択します。

image::images/maven-testing-createconstructor.png[title="生成されたプロジェクトを示す「プロジェクト」ウィンドウ"]


[start=12]
. インポート文を修正([Ctrl]-[Shift]-[I]、Macの場合は[⌘]-[Shift]-[I])して、 ``javax.persistence.NamedQuery`` 、 ``javax.persistence.NamedQueries`` および ``java.util.Date`` のインポート文を追加します。変更を保存します。


=== セッションBeanの作成

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

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

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


[start=2]
. 「Enterprise JavaBeans」カテゴリで「エンティティ・クラスのセッションBean」を選択します。「次」をクリックします。

[start=3]
. 「利用可能なエンティティ・クラス」のリストから ``MyEntity`` クラスを選択し、「追加」をクリックします。「次」をクリックします。

[start=4]
. ウィザードの「生成されるセッションBean」パネルで、デフォルトのプロパティを使用します。「終了」をクリックします。

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

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


[source,java]
----

@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);
    }
    
}
----

[start=5]
.  ``MyEntityFacade.java`` に次のメソッドを追加します。

[source,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);
        }
    }
----

[start=6]
. インポートを修正して必要なインポート文を追加します。変更を保存します。

image::images/maven-testing-fiximports.png[title="生成されたプロジェクトを示す「プロジェクト」ウィンドウ"]

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


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

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

生成されたテストで、EJBコンテナのインスタンスを作成するために ``EJBContainer`` をコールするコードがIDEによって自動的に追加されることを確認します。

1. 「プロジェクト」ウィンドウで「 ``MyEntityFacade.java`` 」を右クリックし、「ツール」→「テストを作成」を選択します。
2. 「フレームワーク」ドロップダウン・リストからテスト・フレームワークを選択します。
3. 「テストを作成」ダイアログ・ボックスのデフォルトのオプションを使用します。「OK」をクリックします。

NOTE: JUnitテストを初めて作成するときは、JUnitフレームワークのバージョンを指定する必要があります。JUnitのバージョンとして「JUnit 4.x」を選択し、「選択」をクリックします。

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


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

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


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

 ``EJBContainer`` をコールする行がテストに含まれていることがわかります。


[source,java]
----

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

[start=6]
.  ``testVerify`` テスト・メソッドのスケルトンに以下の変更(太字部分)を加えます。

[source,java]
----

@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();
}
----

[start=7]
. インポート文を修正して ``junit.framework.Assert`` を追加します。変更を保存します。

ここでPOMを変更して、GlassFishサーバーのローカル・インストールにある ``<glassfish.embedded-static-shell.jar>`` に対する依存性を追加する必要があります。


[start=8]
. エディタで ``pom.xml`` を開き、 ``<properties>`` 要素を見つけます。

[source,xml]
----

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
                
----

[start=9]
.  ``<properties>`` 要素を編集して、ローカルGlassFishインストールのJARの場所を指定する ``<glassfish.embedded-static-shell.jar>`` 要素(*太字*部分)を追加します。このプロパティをアーティファクトに対する依存性で参照します。

[source,xml]
----

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        *<glassfish.embedded-static-shell.jar>_<INSTALLATION_PATH>_/glassfish-4.0/glassfish/lib/embedded/glassfish-embedded-static-shell.jar</glassfish.embedded-static-shell.jar>*

    </properties>
                
----

NOTE:  ``_<INSTALLATION_PATH>_`` は、ローカルGlassFishインストールの絶対パスです。ローカル・インストールへのパスが変更された場合は、POM内のこの要素を変更する必要があります。


[start=10]
. 「プロジェクト」ウィンドウの「依存性」ノードを右クリックし、「依存性の追加」を選択します。

[start=11]
. 「依存性の追加」ダイアログ・ボックスで、「問合せテキスト」フィールドに*「embedded-static-shell」*と入力します。

[start=12]
. 検索結果で4.0 JARを見つけ、「追加」をクリックします。

image::images/add-shell-dependency.png[title="「テスト結果」ウィンドウ"]

「追加」をクリックすると、IDEによってPOMに依存性が追加されます。

ここでPOMを変更して、GlassFishのローカル・インストールをJARのソースとして指定します。


[start=13]
. POMで依存性を見つけ、次のように(*太字*部分)、追加した ``<glassfish.embedded-static-shell.jar>`` プロパティを参照し、 ``<scope>`` を指定するよう要素を変更します。変更を保存します。

[source,xml]
----

        <dependency>
            <groupId>org.glassfish.main.extras</groupId>
            <artifactId>glassfish-embedded-static-shell</artifactId>
            <version>4.0</version>
            *<scope>system</scope>
            <systemPath>${glassfish.embedded-static-shell.jar}</systemPath>*
        </dependency>
                
----

[start=14]
. 「サービス」ウィンドウで「GlassFish Server」ノードを右クリックし、「起動」を選択します。

GlassFish Serverを起動すると、JavaDBデータベース・サーバーも起動します。


[start=15]
. 「プロジェクト」ウィンドウでプロジェクト・ノードを右クリックし、「テスト」を選択します。

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

「テスト結果」ウィンドウにテストの結果が表示されます。「テスト結果」ウィンドウは、メイン・メニューから「ウィンドウ」→「出力」→「テスト結果」を選択して開くことができます。

image::images/maven-test-results.png[title="「テスト結果」ウィンドウ"]

「テスト結果」ウィンドウで、「成功したものを表示」アイコン(image:images/test-ok_16.png[title="「成功したものを表示」アイコン"])をクリックして、成功したすべてのテストのリストを表示できます。この例では、9個のテストに成功したことがわかります。「出力」ウィンドウを見ると、1個のテストのみが実行され、8個のテストがスキップされたことを確認できます。スキップされたテストは、「テスト結果」ウィンドウの成功したテストのリストに含まれます。


[source,java]
----

Running com.mycompany.mavenwebtestapp.MyEntityFacadeTest
verify
...
Inserting entities...
Inserting # 1
Inserting # 2
Inserting # 3
Inserting # 4
Inserting # 5
Found: Entity number 2 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 4 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 3 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 1 created at Wed Oct 09 19:06:59 CEST 2013
Found: Entity number 5 created at Wed Oct 09 19:06:59 CEST 2013
JPA call returned: 5
Done calling EJB
...

Results :

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

----


link:/about/contact_form.html?to=3&subject=Feedback:%20Creating%20an%20Enterprise%20Application%20Using%20Maven[+このチュートリアルに関するご意見をお寄せください+]



== 関連項目

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

* link:javaee-intro.html[+Java EEテクノロジ入門+]
* link:javaee-gettingstarted.html[+Java EEアプリケーションの開始+]
* link:maven-entapp.html[+Mavenを使用したエンタープライズ・アプリケーションの作成+]
* link:../../trails/java-ee.html[+Java EEおよびJava Webの学習+]

エンタープライズBeanの使用方法については、link:http://download.oracle.com/javaee/6/tutorial/doc/[+Java EE 6チュートリアル+]を参照してください。

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

