微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何模拟 @Resource ? .场景使用@Resource 来防止@Cacheable 在从同一 bean 的另一个方法调用时被绕过

如何解决如何模拟 @Resource ? .场景使用@Resource 来防止@Cacheable 在从同一 bean 的另一个方法调用时被绕过

我有一个场景,我在服务层中有 @Cacheable 注释。此类的一种方法调用另一种方法,后者同时具有 @Cacheable 注释。由于我使用的是 Spring AOP,因此每当 createSphereClientA 调用 createSphereClientB 时,@Cacheable 都会被忽略,因为没有代理。我在这里阅读 Spring Cache @Cacheable - not working while calling from another method of the same bean 并使用 @Resource,因为我使用的是 Springboot 2.2.5。

我不想使用 AspectJ,因为它只发生在一个类中。

@服务 公共类 CacheableSphereClientFactoryImpl 实现 SphereClientFactory {

/**
 * 1. Self-autowired reference to proxified bean of this class.
 */
@Resource
private SphereClientFactory self;

@Autowired
public CacheableSphereClientFactoryImpl(CacheablePolicyDao cacheablePolicyDao,UserCustomPolicyDao userCustomPolicyDao,UserAPI userAPI,PolicyMessages policyMessages,PolicyRepository policyRepository,Validator validator) {
    this.cacheablePolicyDao = cacheablePolicyDao;
    this.userCustomPolicyDao = userCustomPolicyDao;
    this.userAPI = userAPI;
    this.policyMessages = policyMessages;
    this.policyRepository = policyRepository;
    this.validator = validator;
}

@Override
@Cacheable(sync = true)
public SphereClient createSphereClientA(@Nonnull TenantConfig tenantConfig) {
    // 2. call cached method using self-bean
    return self.createSphereClient(tenantConfig.getSphereClientConfig());
}

@Override
@Cacheable(sync = true)
public SphereClient createSphereClientB(@Nonnull SphereClientConfig clientConfig) {
    return userAPI.createSphereClient(clientConfig);
}
......... //Some more methods

}

代码运行良好!。现在我正在努力为 createSphereClientA 函数编写 JUnit。 我无法模拟 SphereClientFactory 。

我正在使用

   Mockito Version : 3.3.0
   PowerMock Version : 2.0.5

我尝试了各种方法,例如使用下面的方法并使用 MockitoJUnitRunner 运行

@Mock SphereClientFactory 自身 或 PowerMocking 对象并在 powermockrunner 上运行但没有任何效果:(。每次我收到 NullPointerException 时,因为 SphereClientFactory 实际上从未被这两种方法模拟过。

任何人都知道我该怎么做? 另外上面的方案会不会产生循环依赖?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。