是否有可能解除Spring bean的问题?
我有一个Spring bean,让我们说:
@TransactionAttribute(TransactionAttributeType.REQUIRED) public class AImpl implements A { public void setSomeDependency(D dependency) { // This setter DOES NOT BELONG to interface A } }
现在我想集成测试它,但首先我需要模拟依赖关系D
,因为它做了太多的东西。 由于AImpl
实现了一个接口并包含一个事务注释,因此生成的代理只与接口A
兼容,所以我可以这样做:
@Inject @Named("aImpl") private A a;
但不能:
@Inject @Named("aImpl") private AImpl a;
结果,我无法模仿我的依赖。
请注意,向接口A
添加void setSomeDependency(D dependency)
不是一个选项,因为它没有业务含义。 它既不使用proxy-target-class="true"
,因为它会破坏很多其他bean(此属性会影响上下文中的所有bean)。
有没有办法取消注入注入的bean A
,所以我可以把它投射到AImpl
?
尝试这个:
if(AopUtils.isAopProxy(a) && a instanceof Advised) { Object target = ((Advised)a).getTargetSource().getTarget(); AImpl ai = (AImpl)target; }
额外奖励:在Scala中我使用以下等效函数用于同一目的:
def unwrapProxy(a: AnyRef) = a match { case advised: Advised if(AopUtils.isAopProxy(advised)) => advised.getTargetSource.getTarget case notProxy => notProxy }
随着Spring 4.2.RC1的推出, spring-test
模块中现在有一个专用的实用程序类,可以为您处理这种情况。
该类称为AopTestUtils
并提供方法:
-
getTargetObject
(仅解包顶级代理) -
getUltimateTargetObject
(如果存在,则解包多个级别的代理)。
查看相关提交以及相应的问题 。