2014-06-19 69 views
0

如何单元测试ListenableFuture我使用Guava LoadingCache这样的:番石榴LoadingCache:内的CacheLoader

@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 
    // ... 
} 

我可以测试每行只有一个除外。如何在Runnable任务中单元测试return loadResource(cacheKey)行?现在我正在嘲笑executorService,以确保异步刷新确实发生。

回答

0

如果您正在嘲笑ExecutorService,请使用ArgumentCaptor来获取已通过的ListenableFutureTask。对任务执行call方法,并确认已调用loadResource

2

而不是嘲笑ExecutorService,您可以使用sameThreadExecutor,以便立即执行任务。