【问题标题】:Test DAO classes implemented with JPA测试用 JPA 实现的 DAO 类
【发布时间】:2011-05-10 12:05:31
【问题描述】:

我在一个 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);
        }

    }

}

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

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


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

【问题讨论】:

    标签: java hibernate spring jpa dao


    【解决方案1】:

    不要使用主类进行测试,使用 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);
        }
    }
    

    关键是

    • 解耦你的 spring 上下文(dao 测试将引用 daoContext.xml,但不是 everythingContext.xml
    • 使用PropertyPlaceHolderConfigurerPropertyOverrideConfigurer 机制在测试和生产中使用不同的环境

    附带说明:

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

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

    【讨论】:

    • 我想补充一点,DAO 真的不应该记录异常,只是让它们被抛出。除其他原因外,它使测试更难确定抛出了什么异常。
    【解决方案2】:

    我们的团队也遇到了这个集成问题。问题似乎是你不能真正对依赖应用服务器/容器的类进行单元测试。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2019-10-28
        • 2013-03-30
        • 2011-12-27
        相关资源
        最近更新 更多