У меня есть приложение, использующее Spring 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 }
}
Вы, ребята, знаете об этой проблеме?




Интересно, не возникла ли у вас проблема со стратегией генерации ключей по умолчанию: весенняя документация. Кажется, в этом большая разница между ними. Он меняет то, что он использует для ключа, хотя я думаю, что и то, и другое должно работать.
поиск в кэше выполняется с использованием в качестве ключа параметров метода. Это означает, что вам нужен ключ для методов, у которых нет параметров. Попробуйте этот @Cacheable(value = "keyCache", key = "#root.methodName")