我现在尝试测试@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次: ->在lalalalala.ConfigurationTest.testCacheShouldPreventServiceCallDaoTwice(ConfigurationTest.java:108) 但是是2次。意外的调用:
@EDIT:
因此,按照注释,我修改了测试以使用spring上下文,但是结果仍然没有改变。
@ EDIT2:
现在,问题已解决,我将Mocked Dao和MyService放入@Configuration,并使MyService成为bean。现在可以了。 我失去了使用模拟的dao的可能性,但是我以其他方式对此进行了测试。