Pergunta

Eu vim do acampamento da primavera, não quero usar a primavera e estou migrando para Javaee6, mas tenho problemas para testar o DAO + JPA, aqui está minha amostra simplificada:

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

Este é um DAO muito básico, porque eu vim da primavera, acredito que Dao ainda tem seu valor, então decidi adicionar uma camada 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);
  }
}

Este é um DAO implementado por JPA, espero que o contêiner EE ou o contêiner de teste capazes de injetar o entityManager (assim como a primavera).

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

Este é o meu arquivo de teste.

Ok, aqui vem o problema: como o Junit não entende @javax.inject.inject, o persondao não será capaz de injetar, o teste falhará.

Como encontro uma estrutura de teste capaz de injetar o entityManager no persondaoimpl e @injeje o persondaoimpl para o persondao do teste?

Eu tentei Unitils.org, mas não consigo encontrar uma amostra como essa, apenas injete diretamente o entityManagerFactory no testast, não o que eu quero ...

Foi útil?

Solução

Porque eu vim da primavera, acredito que Dao ainda tem seu valor, então decidi adicionar uma camada DAO.

Eu realmente não vejo o que a primavera tem a ver com isso. E eu não concordo Como escrevi em uma resposta anterior. Para mim, o JPA é uma DAL (camada de acesso a dados) e não vejo o ponto de colocar uma camada de acesso a dados sobre outra camada de acesso a dados. Pelo menos não sistematicamente. Mas não vamos discutir isso.

Este é um DAO implementado por JPA, espero que o contêiner EE ou o contêiner de teste capazes de injetar o entityManager (assim como a primavera).

Se o seu DAO é um componente gerenciado como um feijão gerenciado pelo CDI, o contêiner Java EE deve ser capaz de injetar um EntityManager iniciar.

Por teste de unidade De objetos gerenciados por contêineres, você não precisa de nenhum tipo de contêiner. Por teste de integração, você precisará de algum tipo de contêiner, assim como para feijão de primavera, entidades de hibernação/jpa, feijão de sessão, feijão gerenciado pelo CDI ou qualquer outro tipo de objeto gerenciado por contêineres. Você poderia Use a API incorporável EJB3.1 em seus testes. Também dê uma olhada em Arquillian.

Outras dicas

Você também pode adicionar método PersonDaoImpl.setEntityManager(EntityManager em), então defina -o por Persistence.createEntityManagerFactory("test").createEntityManager(). Não é nada com o contêiner Java EE.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top