我有一个使用Sping Boot 2的应用程序。我想在上面测试一个带有**@Cacheable**(Spring Cache)的方法。我做了一个简单的例子来展示这个想法:
@Service
public class KeyService {
@Cacheable("keyCache")
public String getKey() {
return "fakeKey";
}
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class KeyServiceTest {
@Autowired
private KeyService keyService;
@Test
public void shouldReturnTheSameKey() {
Mockito.when(keyService.getKey()).thenReturn("key1", "key2");
String firstCall = keyService.getKey();
assertEquals("key1", firstCall);
String secondCall = keyService.getKey();
assertEquals("key1", secondCall);
}
@EnableCaching
@Configuration
static class KeyServiceConfig {
@Bean
KeyService keyService() {
return Mockito.mock(KeyService.class);
}
@Bean
CacheManager cacheManager() {
return new ConcurrentMapCacheManager("keyCache");
}
}
}
上面的例子不起作用。但是,如果我改变getKey()
方法来接收一个参数:
@Service
public class KeyService {
@Cacheable("keyCache")
public String getKey(String param) {
return "fakeKey";
}
}
并重构测试以适应该更改,测试将成功运行:
@RunWith(SpringRunner.class)
@SpringBootTest
public class KeyServiceTest {
@Autowired
private KeyService keyService;
@Test
public void shouldReturnTheSameKey() {
Mockito.when(keyService.getKey(Mockito.anyString())).thenReturn("key1", "key2");
String firstCall = keyService.getKey("xyz");
assertEquals("key1", firstCall);
String secondCall = keyService.getKey("xyz");
assertEquals("key1", secondCall);
}
@EnableCaching
@Configuration
static class KeyServiceConfig { //The same code as shown above }
}
你们对这个问题有什么想法吗?
2条答案
按热度按时间jgovgodb1#
使用方法参数作为关键字执行缓存查找。这意味着您需要为没有参数的方法提供关键字。尝试
@Cacheable(value = "keyCache", key = "#root.methodName")
am46iovg2#
您无法可靠地测试用spy/mockbean的cacheable Package 的方法。
更长的答案:这两个代理是相互冲突的,所以你需要提取Cacheable的方法更高级别的bean和mock bean应该在该方法。