您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

模拟CGLIB代理服务的属性不起作用

模拟CGLIB代理服务的属性不起作用

Short answer

你必须解开代理并在目标对象上设置字段:

ReflectionTestUtils.setField(unwrapFooService(), "fooDao", mockFooDao);

在unwrapFooService()可被定义为如下:

private FooServiceImpl unwrapFooService() {
  if(AopUtils.isAopProxy(fooService) && fooService instanceof Advised) {
      Object target = ((Advised) fooService).getTargetSource().getTarget();
      return (FooServiceImpl)target;
  }
  return null;
}

…long one

这个问题很复杂,但是可以解决。你已经猜到这是使用cglib代理的副作用。原则上,Spring创建你的FooServiceImpl名为的子类,类似于FooServiceImpl$EnhancerBycglib。该子类包含对原始以及所有字段的引用(这是可以理解的-这是一个子类)。FooServiceImplFooServiceImpl

因此实际上有两个变量:FooServiceImpl$EnhancerBycglib.fooDaoFooServiceImpl.fooDao。你分配一个模拟前者,但你的服务使用后者。我写了前段时间关于这个陷阱。

其他 2022/1/1 18:18:53 有596人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶