Тестовые классы DAO, реализованные с помощью JPA - PullRequest
1 голос
/ 10 мая 2011

Один из классов DAO, который я реализовал в веб-проекте Java EE, находится под

@Repository("ClientsimpleDAO")
public class ClientsimpleDAOImp implements ClientsimpleDAO {
    private static final Log log = LogFactory.getLog(ClientsimpleDAOImp.class);
    @PersistenceContext
    EntityManager em;
    @Override
    public void delete(Clientsimple clientsimple) {
        // TODO Auto-generated method stub
        log.debug("removing clientsimple");
        try{
            em.remove(clientsimple);
            log.debug("clientsimple removed");
        }
        catch(RuntimeException re){
            log.error("clientsimple remove failure"+re);
        }

    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Clientsimple> findByEntreprise(String entreprise) {
        // TODO Auto-generated method stub
        log.debug("list Cli By entreprise");
        try{
            Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.entreprise= :entreprise");
                  q.setParameter(entreprise,entreprise); 
                  List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
            return cli;
        }catch(RuntimeException re){
            log.error(re);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Clientsimple> findByNom(String nom) {
        // TODO Auto-generated method stub
        log.debug("list Cli By nom");
        try{
            Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.nom= :nom");
                  q.setParameter(nom,nom); 
                  List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
            return cli;
        }catch(RuntimeException re){
            log.error(re);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Clientsimple> findByPrenom(String prenom) {
        // TODO Auto-generated method stub
        log.debug("list Cli By prenom");
        try{
            Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.prenom= :prenom");
                  q.setParameter(prenom,prenom); 
                  List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
            return cli;
        }catch(RuntimeException re){
            log.error(re);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Clientsimple> findByRegion(String region) {
        // TODO Auto-generated method stub
        log.debug("list Cli By region");
        try{
            Query q =em.createQuery("SELECT cli from Clientsimple cli where cli.regioncli= :region");
                  q.setParameter(region,region); 
                  List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
            return cli;
        }catch(RuntimeException re){
            log.error(re);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Clientsimple> getALL() {
        // TODO Auto-generated method stub
        log.debug("list ALL Cli");
        try{
            Query q =em.createQuery("SELECT cli from Clientsimple cli");                  
                  List<Clientsimple> cli= (List<Clientsimple>) q.getSingleResult();
            return cli;
        }catch(RuntimeException re){
            log.error(re);
            return null;
        }
    }

    @Override
    public void save(Clientsimple clientsimple) {
        // TODO Auto-generated method stub
        log.debug("save clientsimple");
        try{
            em.persist(clientsimple);
            log.debug("clientsimple saved");
        }
        catch(RuntimeException re){
            log.error("clientsimple saving failure"+re);
        }
    }

    @Override
    public void update(Clientsimple clientsimple) {
        // TODO Auto-generated method stub
        log.debug("update clientsimple");
        try{
            em.merge(clientsimple);
            log.debug("clientsimple merged");
        }
        catch(RuntimeException re){
            log.error("clientsimple merging failure"+re);
        }

    }

}

, поэтому я не знаю, как я могу протестировать этот дао или другие?

я создал основной класс для его тестирования, но он дает мне ошибку (см. изображение под ним содержит код и ошибку в консоли).enter image description here

на следующем рисунке показана иерархия моего проекта (используются технологии flex, spring, jpa, hibernate);enter image description here

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Не тестируйте с основными классами, используйте тестовую среду Spring. Об этом читайте в разделе 9.3 Интеграционное тестирование .

Пусть ваш класс Test наследуется от одного из классов поддержки Spring, описанных здесь , например AbstractTransactionalJUnit4SpringContextTests, добавьте конфигурацию контекста и некоторые зависимости и проведите некоторое тестирование. Достаточно просто.

@ContextConfiguration("classpath:path/to/your/spring/context.xml")
public class YourServiceTest extends
       AbstractTransactionalJUnit4SpringContextTests{

    @Autowired
    private YourDaoInterfaceHere dao;

    // method is automatically transactional
    @Test
    public void testSomething(){
        dao.persist(someData);
        dao.load(someOtherData);
    }
}

Ключ к

  • развязывает ваши весенние контексты (дао-тест будет ссылаться на daoContext.xml, но не everythingContext.xml)
  • использовать механизмы PropertyPlaceHolderConfigurer или PropertyOverrideConfigurer для использования различных сред в тестировании и производстве

И в качестве примечания:

catch(RuntimeException re){
       log.error("clientsimple remove failure"+re);
}

Вы никогда не должны регистрировать исключение, подобное этому. Вы теряете трассировку стека. Всегда используйте версии log.error(message, throwable).

0 голосов
/ 10 мая 2011

Ваш основной класс не запускает контекст Spring, поэтому ваш EntityManager имеет значение null.Вы должны загрузить свой контекст Spring, и тогда Spring автоматически подключит ваш EntityManager.

0 голосов
/ 10 мая 2011

У нашей команды тоже была проблема с интеграцией.Похоже, проблема в том, что вы не можете на самом деле использовать модульные тестовые классы, сильно полагаясь на сервер / контейнер приложений.

В итоге мы отказались от модульного тестирования для наших DAO и EJB и тестируем их с помощью интеграционных тестоввыходные данные DAO проверяются через службы, которые используют DAO.

...