| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. |
| --> |
| |
| <html> |
| <head> |
| <title>埋込みEJBコンテナを使用したエンタープライズ・アプリケーションのテスト</title> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > |
| <meta name="description" content="A tutorial on how to use the embedded EJB container to test a session bean and entity class."> |
| <meta name="KEYWORDS" content="NetBeans, embedded, EJB, container, GlassFish, JUnit, Tutorial"> |
| <link rel="stylesheet" href="../../../netbeans.css"> |
| <meta name="author" content="ken ganfield"> |
| </head> |
| <body> |
| <h1>埋込みEJBコンテナを使用したエンタープライズ・アプリケーションのテスト</h1> |
| |
| <p>このチュートリアルでは、Java EEエンタープライズ・アプリケーション用のJUnitテストを作成して実行する方法について説明します。このチュートリアルでは、エンティティ・クラスとセッションBeanを含むWebアプリケーションを作成します。最初に、セッションBean用のJUnitテスト・クラスを作成し、埋込みEJBコンテナでそのテストを実行します。次に、プロジェクトにエンティティ・クラスを追加し、テスト・クラスを変更してエンティティ・クラス用のテスト・メソッドを追加します。</p> |
| |
| <p><b>チュートリアルの課題</b></p> |
| <img alt="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます"> |
| <ul> |
| <li><a href="#Exercise_1">セッションBeanのテスト</a> |
| <ul> |
| <li><a href="#Exercise_1a">プロジェクトの作成</a></li> |
| <li><a href="#Exercise_1b">セッションBeanの作成</a></li> |
| <li><a href="#Exercise_1c">セッションBeanのテスト</a></li> |
| <li><a href="#Exercise_1d">コンテナのプロパティを指定するためのテストの変更</a></li> |
| <li><a href="#Exercise_1e">@BeforeClassおよび@AfterClass注釈の使用</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_2">エンティティ・クラスのテスト</a> |
| <ul> |
| <li><a href="#Exercise_2a">エンティティ・クラスの作成</a></li> |
| <li><a href="#Exercise_2b">セッションBeanの変更</a></li> |
| <li><a href="#Exercise_2c">エンティティ・クラスのテスト</a></li> |
| </ul> |
| </li> |
| <li><a href="#Exercise_3">ソリューション・プロジェクトのダウンロード</a></li> |
| <!-- <li><a href="#Exercise_4">Troubleshooting</a></li>--> |
| </ul> |
| <p><b>このチュートリアルに従うには、次のソフトウェアとリソースが必要です。</b></p> |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">ソフトウェアまたはリソース</th> |
| <th class="tblheader" scope="col">必須バージョン</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="/downloads/">NetBeans IDE</a></td> |
| <td class="tbltd1">7.2、7.3、7.4、8.0、Java EEバンドル版</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td> |
| <td class="tbltd1">バージョン7または8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">GlassFish Server Open Source Edition</td> |
| <td class="tbltd1">3.1.xまたは4.x</td> |
| </tr> |
| </tbody> |
| </table> |
| <p class="notes"><strong>注意:</strong></p> |
| <ul> |
| <li>このチュートリアルにはJUnitプラグインが必要です。IDEのインストール時にJUnitプラグインをインストールしなかった場合は、プラグイン・マネージャを開き、「使用可能なプラグイン」タブを選択してJUnitプラグインをインストールしてください。</li> |
| |
| </ul> |
| <p><b>前提条件</b></p> |
| <p>このドキュメントは、次のテクノロジについて基本的な知識またはプログラミング経験を持つ読者を想定して書かれています。</p> |
| <ul> |
| <li>Javaプログラミング</li> |
| <li>NetBeans IDE</li> |
| </ul> |
| |
| <p>このチュートリアルを開始する前に、必要に応じて次のドキュメントをお読みください。</p> |
| <ul> |
| <li><a href="javaee-gettingstarted.html">Java EEアプリケーションの開始</a></li> |
| <li><a href="../java/junit-intro.html">NetBeans IDEでのJUnitテストの記述</a></li> |
| <li><a href="http://download.oracle.com/docs/cd/E19798-01/821-1754/gjlde/index.html">EJB 3.1の埋込み可能APIと埋込みGlassFish Serverの使用</a></li> |
| </ul> |
| <p class="tips"><a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FWebAppJUnit.zip">終了したプロジェクトのZIPアーカイブ</a>はダウンロードできます。</p> |
| |
| <!-- ===================================================================================== --> |
| <a name="Exercise_1"></a> |
| <!--Exercise 1: --> |
| |
| <h2>セッションBeanのテスト</h2> |
| <p>この項では、セッションBeanとエンティティ・クラスを含む単純なJava EE Webアプリケーションを作成します。</p> |
| |
| <div class="indent"> |
| <a name="Exercise_1a"></a> |
| <h3>プロジェクトの作成</h3> |
| |
| <ol> |
| <li>メイン・メニューから「ファイル」>「新規プロジェクト」([Ctrl]-[Shift]-[N]、Macの場合は[⌘]-[Shift]-[N])を選択します。</li> |
| <li>「Java Web」カテゴリから「Webアプリケーション」を選択します。「次」をクリックします。 </li> |
| <li>プロジェクト名を<strong>WebAppJUnit</strong>にし、プロジェクトの場所を設定します。</li> |
| <li>専用フォルダを使用するオプションが選択されている場合は選択を解除します。<br>「次」をクリックします。</li> |
| <li>サーバーを<strong>「GlassFish Server」</strong>に設定し、「Java EEバージョン」を<strong>「Java EE 6 Web」</strong>または<strong>「Java EE 7 Web」</strong>に設定します。<br>「終了」をクリックします。</li> |
| </ol> |
| |
| |
| |
| |
| <a name="Exercise_1b"></a> |
| <h3>セッションBeanの作成</h3> |
| <p>この課題では、2つの数値を追加するメソッド1つを含む非常に単純なセッションBeanを作成します。</p> |
| <ol> |
| <li>「プロジェクト」ウィンドウでWebAppJUnitプロジェクトを右クリックし、「新規」>「その他」を選択します。</li> |
| <li>「Enterprise JavaBeans」カテゴリで「セッションBean」を選択します。「次」をクリックします。</li> |
| <li>「EJB名」に「<strong>MyBean</strong>」と入力します。</li> |
| <li>「パッケージ名」に「<strong>bean</strong>」と入力します。</li> |
| <li>「セッションのタイプ」として「ステートレス」を選択します。「終了」をクリックします。 |
| <p>「終了」をクリックすると、新しいクラスがエディタに表示されます。</p></li> |
| <li>エディタで、クラスに以下のメソッド<tt>addNumbers</tt>を追加します。 |
| <pre class="examplecode"> |
| @Stateless |
| public class MyBean { |
| <strong>public int addNumbers(int numberA, int numberB) { |
| return numberA + numberB; |
| }</strong> |
| }</pre> |
| <p class="notes"><strong>注意:</strong><tt>@LocalBean</tt>注釈を追加したり、このチュートリアルでインタフェースを実装する必要はありません。ビューが明示的に指定されていない場合、デフォルトでは、インタフェースなしのビューが公開されます。</p> |
| </li> |
| <li>変更を保存します。</li> |
| </ol> |
| |
| |
| |
| <a name="Exercise_1c"></a> |
| <h3>セッションBeanのテスト</h3> |
| <p>この課題では、セッションBean用の、<tt>addNumbers</tt>メソッドをテストするテスト・クラスを作成します。IDEでは、ターゲット・クラス内のメソッドに基づいて新しいテスト・クラスとスケルトン・テスト・メソッドを生成できます。</p> |
| <ol> |
| <li>「プロジェクト」ウィンドウで<tt>MyBean</tt>クラスを右クリックし、「ツール」>「テストを作成」を選択します。</li> |
| <li>「フレームワーク」ドロップダウン・リストで「JUnit」を選択します。</li> |
| <li>「テストを作成」ダイアログ・ボックスのデフォルト値を使用します。「OK」をクリックします。<br> <img alt="「テストを作成」ダイアログ" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/create-tests-dialog.png" title="「テストを作成」ダイアログ"> |
| <p class="notes"><strong>注意:</strong>JUnit単体テストを初めて作成するときは、JUnitのバージョンを指定する必要があります。「JUnitのバージョンを選択」ダイアログ・ボックスで「JUnit 4.x」を選択し、「選択」をクリックします。</p> |
| <p>「OK」をクリックすると、IDEによって<tt>MyBeanTest.java</tt>ファイルが生成され、エディタでそのクラスが開かれます。</p> |
| |
| <p>「プロジェクト」ウィンドウで、IDEによって「テスト・パッケージ」ノードの下にテスト・クラスが生成されたことを確認できます。デフォルトでは、<tt>javax.ejb.embeddable.EJBContainer.createEJBContainer()</tt>をコールしてEJBコンテナ・インスタンスを作成するスケルトン・テスト・メソッドがIDEによってテスト・クラス内に生成されます。<tt>createEJBContainer()</tt>メソッドは、EJB 3.1埋込み可能APIの一部である<a href="http://download.oracle.com/javaee/6/api/javax/ejb/embeddable/EJBContainer.html"><tt>EJBContainer</tt></a>クラス内のメソッドの1つです。</p> |
| |
| <p>「プロジェクト」ウィンドウで「テスト・ライブラリ」ノードを展開すると、IDEによってGlassFish Server(埋込み可能コンテナ)とJUnit 4.xがテスト・ライブラリとして自動的に追加されたことを確認できます。GlassFish Serverライブラリを展開すると、ライブラリに<tt>glassfish-embedded-static-shell.jar</tt>が含まれていることを確認できます。 </p> |
| <img alt="「プロジェクト」ウィンドウのスクリーンショット" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/embedded-static-shell-jar.png" title="「プロジェクト」ウィンドウに示されたプロジェクトの構造"> |
| |
| |
| <p class="notes"><strong>注意:</strong><tt>glassfish-embedded-static-shell.jar</tt> JARには、埋込みEJBコンテナのソースは含まれていません。<tt>glassfish-embedded-static-shell.jar</tt> JARには、GlassFishのローカル・インストールが必要です。ローカルのGlassFishインストールのクラスパスは、プロジェクトのターゲット・サーバーによって決定されます。ターゲット・サーバーは、プロジェクトの「プロパティ」ダイアログ・ボックスで変更できます。</p> |
| </li> |
| <li>生成されたスケルトン・テスト・メソッドを変更して、<tt>numberA</tt>、<tt>numberB</tt>および<tt>expResult</tt>の値を指定し、デフォルトのfailのコールを除去します。 |
| <pre class="examplecode">@Test |
| public void testAddNumbers() throws Exception { |
| System.out.println("addNumbers"); |
| <strong>int numberA = 1; |
| int numberB = 2;</strong> |
| EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer(); |
| MyBean instance = (MyBean)container.getContext().lookup("java:global/classes/MyBean"); |
| <strong>int expResult = 3;</strong> |
| int result = instance.addNumbers(numberA, numberB); |
| assertEquals(expResult, result); |
| container.close(); |
| }</pre> |
| </li> |
| <li>「プロジェクト」ウィンドウでプロジェクトを右クリックし、「テスト」を選択します。</li> |
| </ol> |
| <p>テストを実行すると、IDEで「テスト結果」ウィンドウが開き、テストの進捗状況と結果が表示されます。</p> |
| <img alt="「テスト結果」ウィンドウ" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/test-results1.png" title="「テスト結果」ウィンドウ"> |
| <p>「出力」ウィンドウに次のような出力が表示されます。</p> |
| <pre class="examplecode">Testsuite: bean.MyBeanTest |
| addNumbers |
| ... |
| Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 31.272 sec |
| |
| ------------- Standard Output --------------- |
| addNumbers |
| ... |
| ------------- ---------------- --------------- |
| test-report: |
| test: |
| BUILD SUCCESSFUL (total time: 35 seconds)</pre> |
| |
| |
| <a name="Exercise_1d"></a> |
| <h3>コンテナのプロパティを指定するためのテストの変更</h3> |
| <p>「テストを作成」ウィザードを使用したときに、IDEによってEJBコンテナを起動するためのコードを含むデフォルトのスケルトン・テスト・クラスが生成されました。この課題では、コンテナを起動する生成済のコードを変更して、埋込みコンテナ・インスタンスの追加のプロパティを指定できるようにします。</p> |
| |
| <ol> |
| <li>テスト・クラスに以下のコード(太字部分)を追加します。 |
| |
| |
| <pre class="examplecode">@Test |
| public void testAddNumbers() throws Exception { |
| System.out.println("addNumbers"); |
| int numberA = 1; |
| int numberB = 2; |
| |
| // Create a properties map to pass to the embeddable container: |
| <strong>Map<String, Object> properties = new HashMap<String, Object>();</strong> |
| // Use the MODULES property to specify the set of modules to be initialized, |
| // in this case a java.io.File <!--representing an ejb-jar or exploded ejb-jar directory--> |
| <strong>properties.put(EJBContainer.MODULES, new File("build/jar"));</strong> |
| |
| // Create the container instance, passing it the properties map: |
| EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer(<strong>properties</strong>); |
| |
| // Create the instance using the container context to look up the bean |
| // in the directory that contains the built classes |
| MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean"); |
| |
| int expResult = 3; |
| |
| // Invoke the addNumbers method on the bean instance: |
| int result = instance.addNumbers(numberA, numberB); |
| |
| assertEquals(expResult, result); |
| |
| // Close the embeddable container: |
| container.close(); |
| }</pre></li> |
| <li>エディタを右クリックして「インポートを修正」([Alt]-[Shift]-[I]、Macの場合は[⌘]-[Shift]-[I])を選択し、<tt>java.util.HashMap</tt>および<tt>java.util.Map</tt>用のインポート文を追加します。</li> |
| <li>テストを再実行して、変更したテストが機能し、コンテナが正しく作成されることを確認します。 |
| <p class="tips"> 「テスト結果」ウィンドウの「再実行」ボタンをクリックできます。</p> |
| </li> |
| </ol> |
| <!-- TODO: need to check this |
| <p> If I do for example</p> |
| |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/some-folder-with-classes"));</pre> |
| |
| <p>then embeddable EJB container will use the folder |
| <tt>build/some-folder-with-classes</tt> to load EJBs from and the JNDI name to such |
| EJBs would be <tt>"java:global/some-folder-with-classes/<my ejb name>"</tt>. </p> |
| |
| <p>Or I could set it to the following.</p> |
| |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/my-archive.jar"));</pre> |
| |
| <p>and lookup would be <tt>"java:global/my-archive/<my ejb name>"</tt> and only EJBs from |
| my-archive.jar would be loaded.</p> |
| |
| <p>Just for the sake of example, if I wanted to use a single JNDI name regardless |
| of my EJB being in archive or a classes folder then I would have to create |
| ejb-jar.xml and set the module name to "my-module-name" and in unit test I could do</p> |
| |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/some-folder-with-classes"));</pre> |
| <p>or</p> |
| <pre class="examplecode">properties.put(EJBContainer.MODULES, new File("build/my-archive.jar"));</pre> |
| |
| <p>The JNDI name would be the same in both of the cases:<br> |
| <tt>"java:global/my-module-name/<my ejb name>"</tt></p> |
| |
| <p>In the last example you could put this dir/jar in the classpath, skip the |
| property, and get the same result. |
| </p> |
| --> |
| |
| <a name="Exercise_1e"></a> |
| <h3><tt>@BeforeClass</tt>および<tt>@AfterClass</tt>注釈の使用</h3> |
| |
| <p>この課題では、テスト・クラスを変更して、コンテナ・インスタンスを作成するメソッドと停止するメソッドを個別に作成します。これは、同じコンテナ・インスタンスを使用できる複数のテストを実行する場合に役に立つ場合があります。このようにすることで、コンテナ・インスタンスをテストごとに開いて閉じる必要がなくなり、かわりに、テストを実行する前に作成し、すべてのテストが完了した後で閉じるインスタンスを1つ作成します。</p> |
| |
| <p>この課題では、EJBコンテナを作成するコードを<tt>setUpClass</tt>メソッドに移動します。<tt>setUpClass</tt>メソッドには、そのメソッドが最初に(テスト・クラス内の他のメソッドより前に)実行されることを示すために使用される<tt>@BeforeClass</tt>注釈が付いています。この例では、コンテナ・インスタンスが<tt>testAddNumbers</tt>テスト・メソッドの前に作成され、コンテナは停止されるまで存在します。</p> |
| |
| <p>同様に、コンテナを停止するコードを<tt>@AfterClass</tt>注釈が付いた<tt>tearDownClass</tt>メソッドに移動します。</p> |
| |
| <ol> |
| <li>テスト・クラスに以下のフィールドを追加します。 |
| <pre class="examplecode">private static EJBContainer container;</pre></li> |
| <li>コンテナを作成するコードを<tt>testAddNumbers</tt>テスト・メソッドから<tt>setUpClass</tt>メソッドにコピーします。 |
| <pre class=examplecode>@BeforeClass |
| public static void setUpClass() <strong>throws Exception</strong> { |
| <strong>Map<String, Object> properties = new HashMap<String, Object>(); |
| properties.put(EJBContainer.MODULES, new File("build/jar")); |
| container = EJBContainer.createEJBContainer(properties); |
| System.out.println("Opening the container");</strong> |
| }</pre> |
| </li> |
| <li>コンテナを閉じるコードを<tt>testAddNumbers</tt>テスト・メソッドから<tt>tearDownClass</tt>メソッドにコピーします。 |
| <pre class=examplecode>@AfterClass |
| public static void tearDownClass() <strong>throws Exception</strong> { |
| <strong>container.close(); |
| System.out.println("Closing the container");</strong> |
| }</pre> |
| </li> |
| <li><tt>testAddNumbers</tt>から余分なコードを除去します。変更を保存します。</li> |
| </ol> |
| |
| <p>テスト・クラスは次のようになるはずです。</p> |
| <pre class=examplecode>public class MyBeanTest { |
| private static EJBContainer container; |
| |
| public MyBeanTest() { |
| } |
| |
| @BeforeClass |
| public static void setUpClass() throws Exception { |
| Map<String, Object> properties = new HashMap<String, Object>(); |
| properties.put(EJBContainer.MODULES, new File("build/jar")); |
| container = EJBContainer.createEJBContainer(properties); |
| System.out.println("Opening the container"); |
| } |
| |
| @AfterClass |
| public static void tearDownClass() throws Exception { |
| container.close(); |
| System.out.println("Closing the container"); |
| } |
| |
| @Before |
| public void setUp() { |
| } |
| |
| @After |
| public void tearDown() { |
| } |
| |
| /** |
| * Test of addNumbers method, of class MyBean. |
| */ |
| @Test |
| public void testAddNumbers() throws Exception { |
| System.out.println("addNumbers"); |
| int numberA = 1; |
| int numberB = 2; |
| |
| // Create the instance using the container context to look up the bean |
| // in the directory that contains the built classes |
| MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean"); |
| |
| int expResult = 3; |
| |
| // Invoke the addNumbers method on the bean instance: |
| int result = instance.addNumbers(numberA, numberB); |
| |
| assertEquals(expResult, result); |
| } |
| }</pre> |
| |
| <p>コンテナの作成と停止が正しく行われることを確認するためにテストを再実行すると、「テスト結果」ウィンドウに以下のような出力が表示されます。</p> |
| <img alt="「テスト結果」ウィンドウ" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/test-results2a.png" title="「テスト結果」ウィンドウ"> |
| <p><tt>addNumbers</tt>テストの前に<tt>setUpClass</tt>メソッドが実行され、「Opening the container」と表示されたことがわかります。</p> |
| </div> |
| |
| |
| |
| <!-- ===================================================================================== --> |
| <a name="Exercise_2"></a> |
| <h2>エンティティ・クラスのテスト</h2> |
| <p>この項では、エンティティ・クラスと持続性ユニットを作成し、エンティティ・マネージャを注入してエンティティにアクセスするようにセッションBeanを変更します。新しいエンティティ・クラスには、エントリのID番号を出力に表示する単純なメソッドを追加します。次に、データベース内のエントリを作成および確認するための単純なメソッドをセッションBeanにいくつか追加します。 |
| </p> |
| |
| <div class="indent"> |
| <a name="Exercise_2a"></a> |
| <h3>エンティティ・クラスの作成</h3> |
| <p>この項では、新規エンティティ・クラス・ウィザードを使用して、データベース接続の詳細とともにエンティティ・クラスと持続性ユニットを作成します。 |
| <ol> |
| <li>「プロジェクト」ウィンドウでWebAppJUnitプロジェクトを右クリックし、「新規」>「その他」を選択します。</li> |
| <li>「持続性」カテゴリで「エンティティ・クラス」を選択します。「次」をクリックします。</li> |
| <li>「クラス名」に「<strong>SimpleEntity</strong>」と入力します。</li> |
| <li>「パッケージ」ドロップダウン・リストから「bean」を選択します。</li> |
| <li>「主キー型」に「<strong>int</strong>」と入力します。「次」をクリックします。</li> |
| <li>デフォルトの持続性ユニット名と持続性プロバイダを使用します。</li> |
| <li>データ・ソースとして「<tt>jdbc/sample</tt>」を選択し、戦略として「ドロップして作成」を選択します。「終了」をクリックします。<br> <img alt="「エンティティ・クラスの作成」ダイアログ" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/create-entity-wizard.png" title="「エンティティ・クラスの作成」ダイアログ"> |
| <p>「終了」をクリックすると、新しいエンティティ・クラスがエディタに表示されます。「プロジェクト」ウィンドウの「構成ファイル」ノードを展開すると、持続性ユニット<tt>WebAppJUnitPU</tt>のプロパティを定義する<tt>persistence.xml</tt>ファイルがIDEによって自動的に生成されたことを確認できます。</p></li> |
| <li>エディタで、エンティティ・クラスに以下のprivateフィールドを追加します。 |
| <pre class="examplecode">private String name;</pre> |
| </li> |
| <li>ソース・エディタ内を右クリックして「コードを挿入」([Alt]-[Insert]、Macの場合は[Ctrl]-[I])を選択し、「取得メソッドおよび設定メソッド」を選択して「取得メソッドおよび設定メソッドの生成」ダイアログ・ボックスを開きます。</li> |
| <li>ダイアログ・ボックスで「<tt>name</tt>」フィールドを選択します。「生成」をクリックします。<br /> |
| <li>クラスに以下のメソッドを追加します。 |
| <pre class="examplecode"> |
| public SimpleEntity(int id) { |
| this.id = id; |
| name = "Entity number " + id + " created at " + new Date(); |
| }</pre> |
| </li> |
| <li><tt>@NamedQueries</tt>および<tt>NamedQuery</tt>注釈を使用して名前付きSQL問合せを作成します。 |
| <pre class="examplecode">@Entity |
| <strong>@NamedQueries({@NamedQuery(name = "SimpleEntity.findAll", query = "select e from SimpleEntity e")})</strong> |
| public class SimpleEntity implements Serializable {</pre> |
| </li> |
| <li>デフォルト・コンストラクタを作成します。 |
| <p class="tips">IDEでコンストラクタを自動生成する場合は、クラス宣言の横のガターに表示された提案アイコンをクリックできます。</p> |
| </li> |
| <li>インポートを修正して、<tt>javax.persistence.NamedQueries</tt>、<tt>javax.persistence.NamedQuery</tt>および<tt>java.util.Date</tt>のインポート文を追加します。変更を保存します。</li> |
| </ol> |
| |
| <p>デフォルトで生成されるコードに加えて、エンティティ・クラスは次のようになるはずです。</p> |
| |
| <pre class="examplecode">package bean; |
| |
| import java.io.Serializable; |
| import java.util.Date; |
| import javax.persistence.Entity; |
| import javax.persistence.GeneratedValue; |
| import javax.persistence.GenerationType; |
| import javax.persistence.Id; |
| import javax.persistence.NamedQueries; |
| import javax.persistence.NamedQuery; |
| |
| |
| @Entity |
| @NamedQueries({@NamedQuery(name = "SimpleEntity.findAll", query = "select e from SimpleEntity e")}) |
| public class SimpleEntity implements Serializable { |
| private static final long serialVersionUID = 1L; |
| @Id |
| @GeneratedValue(strategy = GenerationType.AUTO) |
| private int id; |
| |
| private String name; |
| |
| public SimpleEntity() { |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| |
| public SimpleEntity(int id) { |
| this.id = id; |
| name = "Entity number " + id + " created at " + new Date(); |
| } |
| |
| |
| |
| ... |
| |
| }</pre> |
| |
| |
| <a name="Exercise_2b"></a> |
| <h3>セッションBeanの変更</h3> |
| <p>この課題では、<tt>MyBean</tt>セッションBeanを編集して、データベース表のデータを挿入および取得するためのメソッドを追加します。</p> |
| <ol> |
| <li>エディタで<tt>MyBean.java</tt>を開きます。</li> |
| <li>エディタ内を右クリックして「コードを挿入」([Alt]-[Insert]、Macの場合は[Ctrl]-[I])を選択し、ポップアップ・メニューから「エンティティ・マネージャの使用」を選択します。 |
| <p>「エンティティ・マネージャの使用」を選択したときに、エンティティ・マネージャを注入するためにIDEによってクラスに以下のコードが追加されました。持続性ユニットの名前が自動的に生成されていることがわかります。</p> |
| <pre class="examplecode">@PersistenceContext(unitName="WebAppJUnitPU") |
| private EntityManager em;</pre> |
| </li> |
| <li>以下の<tt>verify</tt>および<tt>insert</tt>メソッドを追加します。 |
| <pre class="examplecode">@PermitAll |
| public int verify() { |
| String result = null; |
| Query q = em.createNamedQuery("SimpleEntity.findAll"); |
| Collection entities = q.getResultList(); |
| int s = entities.size(); |
| for (Object o : entities) { |
| SimpleEntity se = (SimpleEntity)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); |
| SimpleEntity e = new SimpleEntity(i); |
| em.persist(e); |
| } |
| }</pre></li> |
| <li><tt>javax.persistence.Query</tt>をインポートするようにインポートを修正し、変更内容を保存します。</li> |
| </ol> |
| |
| |
| |
| <a name="Exercise_2c"></a> |
| <h3>エンティティ・クラスのテスト</h3> |
| <p>この課題では、テスト・クラスを編集して、アプリケーションがEJBを検索すること、および<tt>insert</tt>メソッドと<tt>verify</tt>メソッドが正常に動作することをテストするメソッドを追加します。</p> |
| <ol> |
| <li>JavaDBデータベースを起動します。</li> |
| <li>エディタで<tt>MyBeanTest.java</tt>テスト・クラスを開きます。</li> |
| <li>テスト・クラスを編集して、以下の<tt>testInsert</tt>テスト・メソッドを追加します。 |
| <pre class="examplecode">@Test |
| public void testInsert() throws Exception { |
| |
| // Lookup the EJB |
| System.out.println("Looking up EJB..."); |
| MyBean instance = (MyBean) container.getContext().lookup("java:global/classes/MyBean"); |
| |
| System.out.println("Inserting entities..."); |
| instance.insert(5); |
| int res = instance.verify(); |
| System.out.println("JPA call returned: " + res); |
| System.out.println("Done calling EJB"); |
| |
| Assert.assertTrue("Unexpected number of entities", (res == 5)); |
| System.out.println("..........SUCCESSFULLY finished embedded test"); |
| }</pre> |
| </li> |
| <!-- <li>Fix your imports to import <tt>javax.naming.Context</tt> and <tt>junit.framework.Assert</tt>.</li>--> |
| <li>「プロジェクト」ウィンドウでプロジェクト・ノードを右クリックし、ポップアップ・メニューから「テスト」を選択します。</li> |
| </ol> |
| |
| <p>「テスト結果」ウィンドウが開き、以下のような出力が表示されます。</p> |
| |
| <img alt="「テスト結果」ウィンドウ" class="margin-around b-all" src="../../../images_www/articles/72/javaee/junit-embedded-ant/test-results2b.png" title="testInsertテストを追加した後の「テスト結果」ウィンドウ"> |
| |
| <p>テスト・クラスに追加された出力メッセージから、テストの進捗状況とテストの実行順序がわかります。 |
| </p> |
| |
| </div> |
| |
| これで、セッションBean用のテストが完成し、エンティティ・クラスの接続が機能することがわかったので、アプリケーションのWebインタフェースのコーディングを開始できます。 |
| |
| |
| <!-- ===================================================================================== --> |
| <a name="Exercise_3"></a> |
| |
| <h2>ソリューション・プロジェクトのダウンロード</h2> |
| <p>次の方法で、このチュートリアルにソリューションをプロジェクトとしてダウンロードできます。</p> |
| <ul> |
| <li><a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252FWebAppJUnit.zip">終了したプロジェクトのZIPアーカイブ</a>をダウンロードします。</li> |
| <li>次の手順を実行して、プロジェクト・ソースをNetBeansのサンプルからチェックアウトします。 |
| <ol> |
| <li>メイン・メニューから「チーム」>「Subversion」>「チェックアウト」を選択します。</li> |
| <li>「チェックアウト」ダイアログ・ボックスで次のリポジトリURLを入力します。<br><tt>https://svn.netbeans.org/svn/samples~samples-source-code</tt><br>「次」をクリックします。</li> |
| <li>「参照」をクリックして「リポジトリ・フォルダを参照」ダイアログ・ボックスを開きます。</li> |
| <li>ルート・ノードを展開し、<strong>samples/javaee/WebAppJUnit</strong>を選択します。「OK」をクリックします。</li> |
| <li>ソースのローカル・フォルダを指定します(ローカル・フォルダは空である必要があります)。</li> |
| <li>「終了」をクリックします。 |
| <p>「終了」をクリックすると、IDEではローカル・フォルダがSubversionリポジトリとして初期化され、プロジェクト・ソースがチェックアウトされます。</p> |
| </li> |
| <li>チェックアウトが完了するときに表示されるダイアログで、「プロジェクトを開く」をクリックします。</li> |
| </ol> |
| <p class="notes"><strong>注意:</strong></p> |
| <ul> |
| <li>ソースをチェックアウトするには、Subversionクライアントが必要です。Subversionのインストールの詳細は、<a href="../ide/subversion.html">NetBeans IDEでのSubversionガイド</a>の<a href="../ide/subversion.html#settingUp">Subversionの設定</a>の項を参照してください。</li> |
| </ul> |
| </li> |
| </ul> |
| |
| |
| |
| |
| <!--<a name="Exercise_4"></a> |
| |
| <h2>Troubleshooting</h2> |
| <p></p>--> |
| |
| <!--<p>If you are using this tutorial on OS X, you may encounter the following problem when testing the project.</p> |
| <div class="indent"> |
| <h3>OutOfMemory Exception</h3> |
| |
| <p>To prevent an OutOfMemory (OOM) exception, you need to modify the build script.</p> |
| <ol> |
| <li>Expand the project in the Files window.</li> |
| <li>Expand the nbproject node and double-click <tt>build-impl.xml</tt> to open the file in the editor.</li> |
| <li>Search for macrodef-junit in the file.</li> |
| <li>Locate the classpath elements. |
| <pre class="examplecode"> |
| <macrodef name="junit" uri="https://netbeans.org/ns/web-project/2"> |
| ... |
| <sequential> |
| ... |
| <strong><classpath> |
| <path path="${run.test.classpath}"/> |
| <path path="${j2ee.platform.classpath}"/> |
| <path path="${j2ee.platform.embeddableejb.classpath}"/> |
| </classpath></strong> |
| ... |
| <sequential> |
| ... |
| <macrodef name="junit" uri="https://netbeans.org/ns/web-project/2"> |
| </pre></li> |
| <li>Comment out the following classpath element. |
| <pre class="examplecode"><path path="${j2ee.platform.classpath}"/></pre> |
| </li> |
| <li>Save your changes.</li> |
| |
| </ol>--> |
| |
| |
| |
| |
| <br> |
| <div class="feedback-box" ><a href="/about/contact_form.html?to=3&subject=Feedback:%20Using%20the%20Embedded%20EJB%20Container">このチュートリアルに関するご意見をお寄せください</a></div> |
| <br style="clear:both;"> |
| <!-- ======================================================================================= --> |
| <h2><a name="nextsteps"></a>関連項目</h2> |
| <p>NetBeans IDEを使用したJava EEアプリケーションの開発方法の詳細は、次のリソースを参照してください。 |
| </p> |
| <ul> |
| <li><a href="javaee-intro.html">Java EEテクノロジ入門</a></li> |
| <li><a href="javaee-gettingstarted.html">Java EEアプリケーションの開始</a></li> |
| <li><a href="../web/quickstart-webapps.html">Webアプリケーション開発入門</a></li> |
| <li><a href="../../trails/java-ee.html">Java EEおよびJava Webの学習</a></li> |
| </ul> |
| <p>EJB 3.1エンタープライズBeanの使用方法については、<a href="http://download.oracle.com/javaee/6/tutorial/doc/">Java EE 6チュートリアル</a>を参照してください。</p> |
| <p><a href="../../../community/lists/top.html">nbj2eeメーリング・リストに登録する</a>ことによって、NetBeans IDE Java EE開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。</p> |
| </body> |
| </html> |