可缓存和jUnit,看起来像first被忽略了

时间:2018-08-29 09:11:15

标签: java spring junit mockito spring-test

我现在尝试测试@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的可能性,但是我以其他方式对此进行了测试。

0 个答案:

没有答案