我开发了一个Spring Data仓库,MemberRepository
接口,它继承了org.springframework.data.jpa.repository.JpaRepository
。 MemberRepository
有一个方法:
@Cacheable(CacheConfiguration.DATABASE_CACHE_NAME)
Member findByEmail(String email);
这个结果由Spring缓存抽象(由ConcurrentMapCache
支持)进行缓存。
我的问题是,我想编写一个集成测试(针对hsqldb),用于断言第一次从数据库中检索结果,并从缓存中检索结果的第二次。
我最初考虑模拟jpa基础设施(实体管理器等),并以某种方式断言第二次未调用实体管理器,但似乎太难/繁琐(请参见https://dev59.com/leo6XIcBkEYKwwoYJA3p#23442457)。
那么,有人能否提供关于如何测试带有@Cacheable
注释的Spring Data Repository方法的缓存行为的建议?
thenReturn
方法还有可变参数版本... - balteoMockito.verify(repo, Mockito.times(1)).findByEmail("foo");
会通过呢?听起来像是魔法。不过,在测试中你并没有使用模拟引用,而是缓存引用。 - makasprzak@Cacheable(value = "sample", key = "#email.toString()")
当我运行测试时,出现以下错误:org.springframework.expression.spel.SpelEvaluationException: EL1011E:(pos 7): Method call: Attempted to call method toString() on null context object
有任何想法为什么会出现这个错误或如何修复它吗? - wischantimes()
中指定多少次,它总是通过。我还想在最后添加一个调用一次的确认,如verify(repo, Mockito.times(1)).findByEmail("bar");
,但会导致奇怪的 MockitoUnfinishedVerificationException
异常。 - E-RizMockito.verify()
之后立即添加对Mockito.validateMockitoUsage()
的调用,则可以看到问题。似乎Mockito与Spring生成的repo代理不兼容。 - E-Riz