使用JPA测试DAO类

时间:2011-05-10 12:05:31

标签: java hibernate spring jpa dao

我在Java EE Web项目中实现的一个DAO类位于

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

    }

}

所以,我不知道如何测试这个dao或其他?

我已经创建了一个主类来测试它,但它给了我一个错误(请参阅下面的图像包含代码和控制台中的错误)。 enter image description here

左图显示了我的项目层次结构(使用flex,spring,jpa,hibernate的技术);
enter image description here

3 个答案:

答案 0 :(得分:2)

不要使用主类测试,使用Spring的测试框架。请阅读9.3 Integration testing部分中的相关内容。

让您的Test类继承自here所述的一个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);
    }
}

关键是

  • 解耦你的春天背景(dao测试会引用daoContext.xml,但不是everythingContext.xml
  • 使用PropertyPlaceHolderConfigurerPropertyOverrideConfigurer机制在测试和制作中使用不同的环境

作为旁注:

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

你永远不应该记录这样的例外。您正在丢失堆栈跟踪。始终使用log.error(message, throwable)版本。

答案 1 :(得分:0)

我们的团队也有这个整合问题。问题似乎是你不能真正单元测试类如此依赖于应用程序服务器/容器。

我们最终放弃了对DAO和EJB的单元测试,并使用集成测试对它们进行测试 - DAO的输出通过使用DAO的服务进行测试。

答案 2 :(得分:0)

您的主类没有启动Spring上下文,因此您的EntityManager为null。您必须加载Spring上下文,然后Spring将自动装配您的EntityManager。