Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Mock com EntityManager

Gente, boa noite, estou com um projeto em que a minha classe DAO está da seguinte maneira:

    @PersistenceContext
    private EntityManager manager;

    public List<Correntista> find(int agencia, int conta){
        return manager
                .createQuery("select c from Correntista c where c.agencia=:agencia and c.conta=:conta",
                        Correntista.class)
                .setParameter("agencia", agencia)
                .setParameter("conta", conta).getResultList();
    }

E na minha classe de teste, estou tentando escrever o teste dessa maneira:

        EntityManager manager = Mockito.mock(EntityManager.class);
        Query query = Mockito.mock(Query.class);

        CorrentistaDAO correntistaDAO = new CorrentistaDAO();

        Transferencia transferencia = new Transferencia();

        transferencia.setAgenciaOrigem(1);
        transferencia.setContaOrigem(2);
        transferencia.setAgenciaDestino(3);
        transferencia.setContaDestino(4);
        transferencia.setValor(new BigDecimal("10.00"));

        String sql = "select c from Correntista c where c.agencia=:agencia and c.conta=:conta";

        Correntista correntista = new Correntista();

        Mockito.when(manager.createQuery(sql)).thenReturn(query);
        Mockito.when(query.getSingleResult()).thenReturn(correntista);
        Mockito.when(query.setParameter("agencia", transferencia.getAgenciaOrigem())).thenReturn(query);
        Mockito.when(query.setParameter("conta", transferencia.getContaOrigem())).thenReturn(query);

        List<Correntista> lista = correntistaDAO.find(transferencia.getAgenciaOrigem(), transferencia.getContaOrigem());

A minha dúvida é, como eu digo para o meu Dao utilizar o manager q dei o Mock ?

1 resposta
solução!

Existem duas maneiras:

1- Criar um método set no seu DAO e setar manualmente a entity manager mockada no seu DAO.

public void setEntityManager(EntityManager manager){
    this.manager=manager;
}

2- Utilizar a anotação @InjectMocks conforme o exemplo abaixo:

@Mock
private EntityManager manager;

@InjectMocks
private CorrentistaDAO correntistaDAO = new CorrentistaDAO();