Я пытаюсь проверить @Cacheable, а сейчас у меня есть проблемы,
Похоже, что jUnit и контекст Spring просто игнорируют аннотацию @Cacheable
@RunWith(SpringRunner.class)
@DirtiesContext
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = {ConfigConfigurationTest.class})
public class ConfigurationTest {
@TestConfiguration
@EnableCaching()
public static class ConfigConfigurationTest {
@Primary
@Bean(name = "TestCacheBean")
public CacheManager cacheManager() {
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager("TestCache");
return caffeineCacheManager;
}
}
@Autowired
@Qualifier("TestCacheBean")
CacheManager cacheManager;
@Mock
MyDao dao;
MyServiceImpl myServiceImpl ;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
myServiceImpl = new MyServiceImpl(dao);
}
@Test
public void testCacheShouldPreventServiceCallDaoTwice() {
//given
Mockito.when(dao.findOne(1900L)).thenReturn(entity());
//when
CachedDTO conf1 = myServiceImpl.obtain(1900L);
CachedDTO conf2 = myServiceImpl.obtain(1900L);
//then
Mockito.verify(dao, Mockito.times(1)).findOne(1900L);
}
...
}
Моя служба вызывает dao, но dao не кэшируется, а только служба [возвращаются 'DTO', кэшируются], да, возможно, это не очень хорошая практика, но на данный момент нет других способов реорганизовать всю архитектуру.
Пока я вижу, что тест всегда вызывает службу дважды. Также я тестирую множество различных сценариев, как построить такой тест, и всегда получаю один и тот же результат, кешируемый кажется игнорируемым в течение всего процесса.
Результат теста:
org.mockito.exceptions.verification.TooManyActualInvocations:
dao.findOne (1900); Разыскивается 1 раз:
-> at lalalalala.ConfigurationTest.testCacheShouldPreventServiceCallDaoTwice (ConfigurationTest.java:108)
Но было 2 раза. Нежелательный вызов:
@ EDIT:
Итак, после комментариев я изменил тест для использования контекста пружины, но результат по-прежнему не изменился.
@ EDIT2:
На данный момент проблема решена, я поместил Mocked Dao и MyService в @Configuration и сделал MyService также компонентом. Теперь это работает.
Я потерял возможность использовать mocked dao, но я проверил это по-другому.