当前位置:  开发笔记 > 编程语言 > 正文

运行Spring单元测试的AOP问题

如何解决《运行Spring单元测试的AOP问题》经验,为你挑选了1个好方法。

我有一个Spring Web应用程序,它配置为使用JDK代理AOP.AOP注释(例如@Transactional)在接口上声明,而不是在实现类中声明.

应用程序本身工作正常,但是当我运行单元测试时,它似乎试图使用CGLIB来实现AOP功能(而不是JDK代理).这导致测试失败 - 我在下面添加了堆栈跟踪.

我不明白为什么在运行测试时使用CGLIB,因为Spring配置与应用程序运行时大致相同.一个可能的重要区别是测试配置使用DataSourceTransactionManager而不是JTA事务管理器.测试类本身都扩展了AbstractJUnit4SpringContextTests,可能是这个类以某种方式硬连线使用CGLIB?

Caused by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class $Proxy25]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy25
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:213)
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:110)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:488)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:363)
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:324)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:361)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1343)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
    ... 79 more
Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class $Proxy25
    at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)
    at net.sf.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
    at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
    at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:201)
    ... 86 more

编辑:其中一位评论员要求我发布Spring配置.我在下面以缩写形式包含它(即省略了无关的bean和XML命名空间).

为spring-servlet.xml


                 
    
    
            

    
    
      

    
    
        
    

    
    
            

    
    
        
            
                              
            
        
     

     
    
    
        
        
            
        
     

的applicationContext-service.xml中


 
    
    

        

    
    
        
     

    
    

    
    
       
    

    
    

    
      

    
    

    
    

applicationContext-test.xml仅在运行单元测试时包含此内容.它的目的是覆盖其他配置文件中声明的一些bean.


         
    
    
        
     

    
    
        
        
        
        
    

    
        
        
        
        
    

    
    
        
    

digitalsanct.. 8

听起来你正在引用一个实现类而不是一个接口.这里有一个更详细的摘录.

Spring论坛帖子:"混合使用JDK和CGLIB代理"

一篇很棒的博客文章解释了JDK与CGLIB代理的优缺点.



1> digitalsanct..:

听起来你正在引用一个实现类而不是一个接口.这里有一个更详细的摘录.

Spring论坛帖子:"混合使用JDK和CGLIB代理"

一篇很棒的博客文章解释了JDK与CGLIB代理的优缺点.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有