在春季启动测试中测试@Cacheable:未在MockBean上调用咖啡因缓存

时间:2019-02-06 17:43:40

标签: java spring spring-boot spring-test

我想测试由@Cacheable批注缓存的服务级别方法。我正在使用Mockito嘲笑该服务。下面是我的缓存配置和实际测试

尚未使用缓存,并且Mockito验证失败,方法被调用了两次(而不是一次)

我的缓存配置:

@Configuration
@EnableCaching
public class CacheConfiguration implements CachingConfigurer {

    private static final Log LOG = LogFactory.getLog(CacheConfiguration.class);

    @Override
    @Bean
    public CaffeineCacheManager cacheManager() {
        CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager(
            "sample-cache");
        caffeineCacheManager.setCaffeine(caffeineCacheBuilder());
        caffeineCacheManager.setAllowNullValues(false);
        return caffeineCacheManager;
    }

    Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder().maximumSize(50)
            .expireAfterAccess(30, TimeUnit.MINUTES).softValues();
}

测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = *Application.class)
@AutoConfigureMockMvc
public class CachingIntegrationTest {

    @MockBean
    private Service service;

    @Before
    public void setUp() throws {

        Mockito.reset(service);
        String eg = "eg"''

        Mockito.when(service.serviceMethod(argument))
        .thenReturn(eg);

    }

    @Test
    public void verifyCache() throws {

        service.serviceMethod(argument);

        service.serviceMethod(argument);
        Mockito.verify(service, Mockito.times(1)).serviceMethod(argument);

    }

1 个答案:

答案 0 :(得分:2)

我不确定,但是即使@Cacheable注释仍然有效,即使实际上并没有使用带注释的对象而是Mockito模拟对象,我也会感到惊讶。原因是这两种技术(即面向方面的编程注释@Cacheable和模拟)都是通过Java动态代理(或等效的字节码生成)实现的,因此它们很可能会互相干扰。

您应该做的是模拟服务的协作者,然后检查对它们的调用次数。