private <K, V, T extends RemoteTable<K, V>> T getTable(String tableId, TableReadFunction<K, V> readFn,
TableWriteFunction<K, V> writeFn, ExecutorService cbExecutor, boolean retry) {
TableRateLimiter<K, V> readRateLimiter = mock(TableRateLimiter.class);
TableRateLimiter<K, V> writeRateLimiter = mock(TableRateLimiter.class);
TableRetryPolicy readPolicy = retry ? new TableRetryPolicy() : null;
TableRetryPolicy writePolicy = retry ? new TableRetryPolicy() : null;
ExecutorService rateLimitingExecutor = Executors.newSingleThreadExecutor();
ScheduledExecutorService retryExecutor = Executors.newSingleThreadScheduledExecutor();
RemoteTable<K, V> table = new RemoteTable(tableId, readFn, writeFn,
readRateLimiter, writeRateLimiter, rateLimitingExecutor,
readPolicy, writePolicy, retryExecutor, cbExecutor);
table.init(getMockContext());
return (T) table;
}