bugfix> java > 投稿

Spring 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 }
}

この問題について何かご存知ですか?

回答 2 件
  • メソッドのパラメーターをキーとして使用してキャッシュ検索が実行されます。つまり、paramsを持たないメソッドにはキーが必要です。これを試してみてください

  • デフォルトの鍵生成戦略の問題、つまり春のドキュメントに直面しているのではないかと思います。それが2つの大きな違いのようです。私はどちらかがうまくいくと思うかもしれませんが、キーに使用しているものを変えています。

    @Cacheable(value = "keyCache", key = "#root.methodName")

あなたの答え