Кэш загрузки Guava: как модульно протестировать ListenableFuture в CacheLoader

#java #unit-testing #junit #mockito #guava

#java #модульное тестирование #junit #mockito #guava

Вопрос:

Я использую кэш загрузки Guava следующим образом:

 @Inject
private ExecutorService executorService;

private LoadingCache<CacheKey, ResponseEntity<String>> constructCache() {
    return CacheBuilder.newBuilder()
        .maximumSize(100)
        .expireAfterWrite(15, TimeUnit.MINUTES)
        .build(
            new CacheLoader<CacheKey, ResponseEntity<String>>() {
                @Override
                public ResponseEntity<String> load(CacheKey cacheKey) throws Exception {
                    return loadResource(cacheKey);
                }
                @Override
                public ListenableFuture<ResponseEntity<String>> reload(final CacheKey cacheKey, ResponseEntity<String> old) {
                    ListenableFutureTask<ResponseEntity<String>> task = ListenableFutureTask.create(new Callable<ResponseEntity<String>>() {
                        @Override
                        public ResponseEntity<String> call() throws Exception {
                            // this line here!
                            return loadResource(cacheKey);
                        }
                    });
                    executorService.execute(task);
                    return task;
                }
            }
        );
}

private ResponseEntity<String> loadResource(CacheKey cacheKey) {
    // ...
    // external call
    // ...
}
  

Я могу протестировать каждую строку, кроме одной. Как мне выполнить модульное тестирование строки return loadResource(cacheKey) в выполняемой задаче? Прямо сейчас я издеваюсь над ExecutorService, чтобы убедиться, что асинхронное обновление действительно происходит.

Ответ №1:

Вместо того, чтобы издеваться ExecutorService , вы можете использовать sameThreadExecutor , чтобы задача немедленно выполнялась.

Ответ №2:

Если вы издеваетесь ExecutorService , используйте an ArgumentCaptor , чтобы получить ListenableFutureTask то, что было передано. Запустите call метод для задачи и убедитесь, что loadResource он был вызван.