Frage

ich vom Frühling Lager kam, ich will nicht, Frühling verwenden und zu JavaEE6 ist migrieren, Aber ich habe Probleme testen DAO + JPA, hier ist mein vereinfachte Beispiel:

public interface PersonDao
{
  public Person get(long id);
}

Dies ist ein sehr einfaches DAO, weil ich von Frühling kam, glaube ich DAO noch seinen Wert hat, so dass ich eine DAO Schicht hinzuzufügen entschieden.

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

Dies ist eine JPA-implementiertes DAO, ich hoffe, die EE Behälter oder den Testbehälter der Lage, die EntityManager zu injizieren (wie Frühling der Fall ist).

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

Das ist meine Testdatei.

OK, hier kommt das Problem: Da JUnit nicht versteht @ javax.inject.Inject, wird die PersonDao nicht in der Lage sein, injiziert wird, schlägt der Test fehl.

Wie finde ich einen Test-Framework, dass die Lage PersonDaoImpl zum PersonDao von Testcase die EntityManager zum PersonDaoImpl und @Inject zu injizieren?

Ich habe versucht, unitils.org, kann aber nicht eine Probe wie diese, es nur direkt injizieren, um die EntityManagerFactory zum TestCast, nicht das, was ich will ...

finden
War es hilfreich?

Lösung

  

, weil ich von Frühling kam, glaube ich DAO noch seinen Wert hat, so dass ich eine DAO Schicht hinzuzufügen entschieden.

Ich sehe nicht wirklich das, was Frühling mit dieser zu tun hat. Und ich bin nicht einverstanden wie ich schrieb in eine vorherige Antwort . Für mich ist JPA ein DAL (Datenzugriffsschicht), und ich sehe nicht den Punkt der eine Datenzugriffsschicht auf einer anderen Datenzugriffsschicht setzen. Zumindest nicht systematisch. Aber lassen Sie sich nicht darüber reden.

  

Dies ist eine JPA-implementiertes DAO, ich hoffe, die EE Behälter oder den Testbehälter der Lage, die EntityManager zu injizieren (wie Frühling der Fall ist).

Wenn Sie Ihre DAO eine verwaltete Komponente wie ein CDI Managed Bean ist, dann sollte die Java EE Container Lage sein, eine EntityManager darin zu injizieren.

Unit-Tests von Container-verwaltete Objekte, Sie brauchen nicht jede Art von Container. Für Integrationstests , werden Sie eine Art von Containern benötigen, so wie du für Spring-Beans tun, Hibernate / JPA-Entitäten, Session Beans, CDI Bohnen oder jede andere Art von Container-verwaltete Objekt verwaltet. Sie könnten verwenden, um die EJB3.1 embeddable API in Ihren Tests . Haben Sie auch einen Blick auf Arquillian .

Andere Tipps

Sie können auch Verfahren PersonDaoImpl.setEntityManager(EntityManager em) hinzufügen, dann durch Persistence.createEntityManagerFactory("test").createEntityManager() gesetzt. Es ist nichts mit Java EE-Container.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top