Java 用JPA实现的测试DAO类

Java 用JPA实现的测试DAO类,java,hibernate,spring,jpa,dao,Java,Hibernate,Spring,Jpa,Dao,我在JavaEEWeb项目中实现的一个DAO类正在开发中 @Repository("ClientsimpleDAO") public class ClientsimpleDAOImp implements ClientsimpleDAO { private static final Log log = LogFactory.getLog(ClientsimpleDAOImp.class); @PersistenceContext EntityManager em;

我在JavaEEWeb项目中实现的一个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);
        }

    }

}
@Repository(“ClientsimpleDAO”)
公共类ClientsimpleDAOImp实现ClientsimpleDAO{
私有静态最终日志日志=LogFactory.getLog(ClientsimpleDAOImp.class);
@持久上下文
实体管理器;
@凌驾
public void delete(Clientsimple Clientsimple){
//TODO自动生成的方法存根
调试(“删除clientsimple”);
试一试{
em.remove(clientsimple);
log.debug(“clientsimple已删除”);
}
捕获(运行时异常re){
日志错误(“clientsimple删除失败”+re);
}
}
@抑制警告(“未选中”)
@凌驾
公共列表FindByEnterprise(字符串企业){
//TODO自动生成的方法存根
log.debug(“按企业列出Cli”);
试一试{
Query q=em.createQuery(“从Clientsimple cli中选择cli,其中cli.enterprise=:enterprise”);
q、 设置参数(Enterprise,Enterprise);
List cli=(List)q.getSingleResult();
返回cli;
}捕获(运行时异常re){
日志错误(re);
返回null;
}
}
@抑制警告(“未选中”)
@凌驾
公共列表findByNom(字符串名称){
//TODO自动生成的方法存根
log.debug(“按名称列出Cli”);
试一试{
Query q=em.createQuery(“从Clientsimple cli中选择cli,其中cli.nom=:nom”);
q、 设置参数(nom,nom);
List cli=(List)q.getSingleResult();
返回cli;
}捕获(运行时异常re){
日志错误(re);
返回null;
}
}
@抑制警告(“未选中”)
@凌驾
公共列表findByPrenom(字符串prenom){
//TODO自动生成的方法存根
log.debug(“通过prenom列出Cli”);
试一试{
Query q=em.createQuery(“从Clientsimple cli中选择cli,其中cli.prenom=:prenom”);
q、 设置参数(prenom,prenom);
List cli=(List)q.getSingleResult();
返回cli;
}捕获(运行时异常re){
日志错误(re);
返回null;
}
}
@抑制警告(“未选中”)
@凌驾
公共列表findByRegion(字符串区域){
//TODO自动生成的方法存根
log.debug(“按区域列出Cli”);
试一试{
Query q=em.createQuery(“从Clientsimple cli中选择cli,其中cli.regioncli=:region”);
q、 设置参数(区域,区域);
List cli=(List)q.getSingleResult();
返回cli;
}捕获(运行时异常re){
日志错误(re);
返回null;
}
}
@抑制警告(“未选中”)
@凌驾
公共列表getALL(){
//TODO自动生成的方法存根
log.debug(“列出所有Cli”);
试一试{
Query q=em.createQuery(“从Clientsimple cli中选择cli”);
List cli=(List)q.getSingleResult();
返回cli;
}捕获(运行时异常re){
日志错误(re);
返回null;
}
}
@凌驾
public void save(Clientsimple Clientsimple){
//TODO自动生成的方法存根
log.debug(“saveclientsimple”);
试一试{
em.persist(clientsimple);
log.debug(“clientsimple已保存”);
}
捕获(运行时异常re){
日志错误(“客户端简单保存失败”+re);
}
}
@凌驾
公共无效更新(Clientsimple Clientsimple){
//TODO自动生成的方法存根
调试(“更新clientsimple”);
试一试{
em.merge(clientsimple);
log.debug(“clientsimple合并”);
}
捕获(运行时异常re){
日志错误(“客户端简单合并失败”+re);
}
}
}
所以,我不知道如何测试这把刀或其他刀

我已经创建了一个主类来测试它,但是它给了我一个错误(请参见它下面的图片,其中包含代码和控制台中的错误)。



下图显示了我的项目层次结构(使用flex、spring、jpa和hibernate的技术)

我们的团队也有这个集成问题。问题似乎在于,您无法真正地单元测试如此严重地依赖于应用程序服务器/容器的类


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

主类没有启动Spring上下文,因此EntityManager为空。您必须加载Spring上下文,然后Spring将自动连接EntityManager。

不要使用主类进行测试,请使用Spring的测试框架。请在本节中阅读

让您的测试类从所描述的一个Spring支持类继承,例如,添加上下文配置和一些依赖项,并执行一些测试。很简单

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

  • 分离spring上下文(dao测试将引用
    daoContext.xml
    ,而不是
    everythingContext.xml
  • 使用
    PropertyPlaceHolderConfigure
    PropertyOverrideConfiguer
    机制在测试和生产中使用不同的环境

作为旁注:

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

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

我想补充一点,DAO不应该记录异常,只要抛出它们就行了。除其他原因外,这使得测试更难确定抛出了什么异常。