Domanda

Sono uscito dal campo di primavera, io non voglio usare primavera, e sono la migrazione a JavaEE6, Ma ho test problema DAO + JPA, ecco il mio esempio semplificato:

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

Questo è un DAO molto semplice, perché sono venuto a partire dalla primavera, credo che DAO ha ancora il suo valore, così ho deciso di aggiungere uno strato 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);
  }
}

Questa è una DAO JPA attuate, spero che il contenitore EE o il contenitore di test in grado di iniettare l'EntityManager (proprio come primavera fa).

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

Questo è il mio file di prova.

OK, qui viene il problema: Poiché JUnit non comprende @ javax.inject.Inject, il PersonDao non potrà iniettato, il test fallisce.

Come faccio a trovare un framework di test che in grado di iniettare l'EntityManager al PersonDaoImpl, e @Inject le PersonDaoImpl al PersonDao di TestCase?

ho provato unitils.org, ma non riesco a trovare un campione come questo, basta iniettare direttamente l'EntityManagerFactory al TestCast, non quello che voglio ...

È stato utile?

Soluzione

  

perché sono venuto a partire dalla primavera, credo che DAO ha ancora il suo valore, così ho deciso di aggiungere uno strato DAO.

Non ho davvero vedere cosa primavera ha a che fare con questo. E io non sono d'accordo come ho scritto in una risposta precedente . Per me, è un APP DAL (Data Access Layer), e non vedo il punto di mettere uno strato di accesso ai dati sopra un altro strato di accesso ai dati. Almeno non in modo sistematico. Ma non discutere di questo.

  

Questa è una DAO JPA attuate, spero che il contenitore EE o il contenitore di test in grado di iniettare l'EntityManager (proprio come primavera fa).

Se il DAO è un componente gestito come un CDI bean gestito, allora il container Java EE dovrebbe essere in grado di iniettare un EntityManager in esso.

Unità di test di oggetti gestite dal contenitore, non è necessario alcun tipo di contenitore. Per test di integrazione , avrete bisogno di un qualche tipo di contenitore, proprio come si fa per i bean Spring, Hibernate entità / JPA, fagioli di sessione, CDI gestito fagioli o qualsiasi altro tipo di oggetto contenitore gestiti. Si potrebbe utilizzare l'API EJB3.1 integrabile nella propria test . Anche dare un'occhiata alle Arquillian .

Altri suggerimenti

Si potrebbe anche aggiungere il metodo PersonDaoImpl.setEntityManager(EntityManager em), quindi impostarlo per Persistence.createEntityManagerFactory("test").createEntityManager(). Non è niente di container Java EE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top