Takunojiのプログラミング・プレイグラウンド(遊び場)

Javaプログラミングを基本にして、ゲーム作成に必要なことの調査結果、やったら面白そうなことなどを記載します。プログラミングのススメ的なことも記載します。プログラミングで楽しく遊ぶために色々と記載して行きます。

JUnit Testing with JPA

JUnitJPAでのテストを実行する

1.testgフォルダを切る

2.persistence.xmlにプロパティをしていしてDBへの接続情報を設定する

        <properties>

            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>

            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres"/>

            <property name="javax.persistence.jdbc.user" value="DBのユーザー"/>

            <property name="javax.persistence.jdbc.password" value="パスワード"/>

            <property name="eclipselink.ddl-generation" value="none"/>

<!-- ここの部分でテーブルの自動Create, Dropなどを設定する -->

<property name="eclipselink.id-validation" value="NONE"/>

        </properties>

 

出力されたエラー

Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

だが、解決方法がわからない。調査したが「appserv-rt.jar」を追加してやれば

プロパティを読み込んでくれるらしいのだが.........

予想、

1.persistence-unitの名前がテストでない方のxmlと被ってプロパティが読めない…

→関係なかった......

色々と調べたが、SystemPropertyを取得したり、設定を行う必要があるみたいだ....

参考サイト

https://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit

 

JUnitでのテスト時には、サーバーを起動しないためtaransaction-type="RESOURCE-LOCAL"での実行になる → EntityManagerFactoryの読み込みが変わる

テストクラスで、実装したものを使用して実行する

 

やっぱり、NoInitialContextExceptionがでる......

 

Mavenを使用しての単体テストではpropertyをソースから指定してやる。

persistence.xmlのプロパティを直接読み込む必要がある

PersistenceUnitProperties.プロパティ名を使用してPropertiesに値を設定→テスト

を繰り返したが.... ダメ

 

仕切り直し、下記のようにpersistence.xmlを書き直す。

<persistence-unit name="NoJta" transaction-type="RESOURCE_LOCAL">

        <jta-data-source>jdbc/プロジェクト名</jta-data-source>

        <class>エンティティクラス</class>

       <properties>

<property name="persistenceXmlLocation" value="META-INF/persistence.xml" />

            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>

            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/postgres"/>

            <property name="javax.persistence.jdbc.user" value="ユーザー名"/>

            <property name="javax.persistence.jdbc.password" value="パスワード"/>

            <property name="eclipselink.ddl-generation" value="none"/>

<property name="eclipselink.id-validation" value="NONE"/>

        </properties>

</persistence-unit>

 テスト実行、エラーなし!!!!

今までの苦労がーーーーー!!

 

まぁ勉強になったけどね⭐️

このサイトは参考になりました。

Eclipse Community Forums: EclipseLink » EclipseLink + RCP + OSGI Service: No Persistence provider for EntityManager