spring Sping Boot 2 -使用Mockito测试没有参数的方法的@Cacheable不起作用

6ioyuze2  于 2023-03-22  发布在  Spring
关注(0)|答案(2)|浏览(172)

我有一个使用Sping 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 }
}

你们对这个问题有什么想法吗?

jgovgodb

jgovgodb1#

使用方法参数作为关键字执行缓存查找。这意味着您需要为没有参数的方法提供关键字。尝试@Cacheable(value = "keyCache", key = "#root.methodName")

am46iovg

am46iovg2#

您无法可靠地测试用spy/mockbean的cacheable Package 的方法。
更长的答案:这两个代理是相互冲突的,所以你需要提取Cacheable的方法更高级别的bean和mock bean应该在该方法。

相关问题