#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
он был вызван.