我想测试由@Cacheable
批注缓存的服务级别方法。我正在使用Mockito嘲笑该服务。下面是我的缓存配置和实际测试
尚未使用缓存,并且Mockito验证失败,方法被调用了两次(而不是一次)
我的缓存配置:
@Configuration
@EnableCaching
public class CacheConfiguration implements CachingConfigurer {
private static final Log LOG = LogFactory.getLog(CacheConfiguration.class);
@Override
@Bean
public CaffeineCacheManager cacheManager() {
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager(
"sample-cache");
caffeineCacheManager.setCaffeine(caffeineCacheBuilder());
caffeineCacheManager.setAllowNullValues(false);
return caffeineCacheManager;
}
Caffeine<Object, Object> caffeineCacheBuilder() {
return Caffeine.newBuilder().maximumSize(50)
.expireAfterAccess(30, TimeUnit.MINUTES).softValues();
}
测试:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = *Application.class)
@AutoConfigureMockMvc
public class CachingIntegrationTest {
@MockBean
private Service service;
@Before
public void setUp() throws {
Mockito.reset(service);
String eg = "eg"''
Mockito.when(service.serviceMethod(argument))
.thenReturn(eg);
}
@Test
public void verifyCache() throws {
service.serviceMethod(argument);
service.serviceMethod(argument);
Mockito.verify(service, Mockito.times(1)).serviceMethod(argument);
}
答案 0 :(得分:2)
我不确定,但是即使@Cacheable
注释仍然有效,即使实际上并没有使用带注释的对象而是Mockito模拟对象,我也会感到惊讶。原因是这两种技术(即面向方面的编程注释@Cacheable
和模拟)都是通过Java动态代理(或等效的字节码生成)实现的,因此它们很可能会互相干扰。
您应该做的是模拟服务的协作者,然后检查对它们的调用次数。