当前位置: 首页 > 知识库问答 >
问题:

只有在测试对@Cacheable方法的直接调用时,Spring声明式缓存测试才有效

张岳
2023-03-14

我正在尝试使用以下代码测试@Cacheable方法,但不起作用,该方法未被缓存,如果不是将@Cacheable放在getCountCache方法中,而是将其放在getCount方法中,则测试有效,尝试了很多事情但找不到原因。

@ContextConfiguration
@ExtendWith(SpringExtension.class)
public class CacheTest {

    static class MyRepoImpl {

        private Count count;

        public MyRepoImpl(Count count){
            this.count = count;
        }

        public int getCount(String key){
            return getCountCache(key);
        }

        @Cacheable(cacheNames = "sample")
        public int getCountCache(String key) {
            return count.getCount();
        }
    }

    static class Count {
        int i = 0;
        public int getCount() {
            return i++;
        }
    }

    @EnableCaching
    @Configuration
    public static class Config {

        @Bean CacheManager cacheManager() {
            return new ConcurrentMapCacheManager();
        }

        @Bean MyRepoImpl myRepo() {
            count = Mockito.mock(Count.class);
            return new MyRepoImpl(count);
        }
    }

    static Count count;

    @Autowired MyRepoImpl repo;

    @Test
    public void methodInvocationShouldBeCached() {

        Mockito.when(count.getCount()).thenReturn(1, 2, 3, 4);

        Object result = repo.getCount("foo");
        assertThat(result).isEqualTo(1);
        Mockito.verify(count, Mockito.times(1)).getCount();

        result = repo.getCount("foo");
        assertThat(result).isEqualTo(1);
        Mockito.verify(count, Mockito.times(1)).getCount();
    }
}

共有1个答案

阎弘
2023-03-14

由于Spring缓存在bean方法的代理上工作,因此从类内部调用的带有Cachable注释的bean方法不会缓存。为了使缓存机制工作,您需要直接从类外调用它。当从同一个类中调用Spring cache@Cacheable方法时忽略了这个解释真的很好。

 类似资料:
  • 问题内容: 我已经开发了一个Spring Data仓库,扩展了接口有一个方法: 结果由Spring缓存抽象(由)支持缓存。 我的问题是,我想要写一个集成测试(针对HSQLDB)断言结果被从数据库第一次检索,并从缓存中的第二次。 我最初想到模拟jpa基础结构(实体管理器等),并以某种方式断言第二次不调用实体管理器,但似乎太难/麻烦了)。 然后有人可以提供有关如何测试带有注释的Spring Data

  • 我最初想嘲弄一下jpa基础结构(实体管理器等),并以某种方式断言实体管理器不是第二次调用的,但它似乎太难/太累赘了(参见https://stackoverflow.com/A/23442457/536299)。 那么,有人能提供建议,如何测试用注释的Spring数据存储库方法的缓存行为吗?

  • 当我调用我用注释的方法时,我知道缓存没有被使用,因为我在方法内部进行了打印,如果使用了缓存,就不应该打印它。 在日志中,我知道缓存正在初始化 我应该提到调用该方法的方法是常规Java

  • 问题内容: 这可能吗?我尝试过,但EasyMock抱怨时间必须> = 1 问题答案: 我设法提出了一个解决方案:

  • 我试图测试Spring数据JPA存储库(扩展)的Spring缓存支持(如本文所述),但我的配置确实有问题。 下面是我的测试: 通过运行上面的测试,我注意到类型的对象作为键传递给,而null作为值传递给: 下面是堆栈跟踪:

  • 我正在使用spring框架构建rest api,只是为了学习,我在用关系保存数据时遇到了一些问题。我正在构建一种书店,我的book实体看起来像这个@entity public class book{@id@generatedValue(strategy=generationtype.auto)私有长ID; }