JPA実装でDAOをテストするにはどうすればよいですか?
質問
私は春のキャンプから来ました、私は春を使いたくありません、そしてJavaee6に移住していますが、私はDAO + JPAのテストに問題があります、ここに私の単純化されたサンプルがあります:
public interface PersonDao
{
public Person get(long id);
}
これは非常に基本的な DAO です。私は Spring から来たので、DAO にはまだ価値があると信じているので、DAO レイヤーを追加することにしました。
public class PersonDaoImpl implements PersonDao , Serializable
{
@PersistenceContext(unitName = "test", type = PersistenceContextType.EXTENDED)
EntityManager entityManager ;
public PersonDaoImpl()
{
}
@Override
public Person get(long id)
{
return entityManager .find(Person.class , id);
}
}
これは JPA で実装された DAO です。EE コンテナまたはテスト コンテナが (Spring と同じように) EntityManager を注入できることを願っています。
public class PersonDaoImplTest extends TestCase
{
@Inject
protected PersonDao personDao;
@Override
protected void setUp() throws Exception
{
//personDao = new PersonDaoImpl();
}
public void testGet()
{
System.out.println("personDao = " + personDao); // NULL !
Person p = personDao.get(1L);
System.out.println("p = " + p);
}
}
これは私のテスト ファイルです。
さて、ここで問題が発生します。JUnit は @javax.inject.Inject を理解できないため、 PersonDao は注入できず、テストは失敗します。
EntityManager を PersonDaoImpl に注入し、 PersonDaoImpl を TestCase の PersonDao に @Inject できるテスト フレームワークを見つけるにはどうすればよいですか?
untils.org を試しましたが、このようなサンプルは見つかりません。EntityManagerFactory を TestCast に直接注入するだけで、私が望むものではありません...
解決
私は Spring から来たので、DAO にはまだ価値があると信じているので、DAO レイヤーを追加することにしました。
Spring がこれと何の関係があるのかよくわかりません。そして私は同意しません 前の回答で書いたように. 。私にとって、JPA は DAL (データ アクセス レイヤー) であり、データ アクセス レイヤーを別のデータ アクセス レイヤーの上に置く意味がわかりません。少なくとも体系的にはそうではありません。しかし、これについては議論しないでおこう。
これは JPA で実装された DAO です。EE コンテナまたはテスト コンテナが (Spring と同じように) EntityManager を注入できることを願っています。
DAO が CDI マネージド Bean のようなマネージド コンポーネントである場合、Java EE コンテナは EntityManager
初期化。
のために 単体テスト コンテナー管理オブジェクトの場合、いかなる種類のコンテナーも必要ありません。のために 統合テスト, Spring Bean、Hibernate/JPA エンティティ、セッション Bean、CDI 管理 Bean、またはその他の種類のコンテナ管理オブジェクトの場合と同様に、何らかの種類のコンテナが必要になります。あなたは出来る テストで EJB3.1 組み込み可能 API を使用する. 。こちらもご覧ください アルクイリアン.
他のヒント
また、その後PersonDaoImpl.setEntityManager(EntityManager em)
でそれを設定し、メソッドPersistence.createEntityManagerFactory("test").createEntityManager()
を追加することができます。
これは、Java EEコンテナと何もない。