1

私は Spring キャンプから来ました。Spring を使用したくありません。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 コンテナーまたはテスト コンテナーが EntityManager を注入できることを願っています (Spring のように)。

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

これは私のテストファイルです。

OK 、ここで問題が発生します。JUnit は @javax.inject.Inject を認識しないため、PersonDao は注入できず、テストは失敗します。

EntityManager を PersonDaoImpl に注入し、 @Inject PersonDaoImpl を TestCase の PersonDao に注入できるテスト フレームワークを見つけるにはどうすればよいですか?

unitils.org を試しましたが、このようなサンプルが見つかりません。必要なものではなく、 EntityManagerFactory を TestCast に直接注入するだけです...

4

2 に答える 2

5

私は春から来たので、DAOにはまだ価値があると思うので、DAOレイヤーを追加することにしました。

Springがこれと何の関係があるのか​​よくわかりません。そして、私は前の答えで書いたように同意しません。私にとって、JPAはDAL(データアクセス層)であり、データアクセス層を別のデータアクセス層の上に置くことの意味がわかりません。少なくとも体系的にではありません。しかし、これについては議論しないでください。

これはJPAで実装されたDAOです。EEコンテナーまたはテストコンテナーがEntityManagerを注入できることを願っています(Springと同じように)。

DAOがCDIマネージドBeanのようなマネージドコンポーネントである場合、JavaEEコンテナはEntityManagerそれにインジェクトでき​​るはずです。

コンテナ管理オブジェクトの単体テストでは、どのような種類のコンテナも必要ありません。統合テストには、Spring Bean、Hibernate / JPAエンティティ、セッションBean、CDI管理対象Bean、またはその他の種類のコンテナ管理対象オブジェクトの場合と同様に、ある種のコンテナが必要になります。テストでは、EJB3.1の埋め込み可能なAPIを使用できます。アルキリア星人もご覧ください。

于 2010-03-21T17:07:10.513 に答える
-1

PersonDaoImpl.setEntityManager(EntityManager em)method を追加して、 で設定することもできますPersistence.createEntityManagerFactory("test").createEntityManager()。Java EE コンテナーでは何もありません。

于 2010-04-06T14:23:31.990 に答える