DataClientVeneerApi implements DataClientWrapper { @Override public ApiFuture<Result> readRowAsync( String tableId, ByteString rowKey, @Nullable Filters.Filter filter) { return ApiFutures.transform( delegate.readRowAsync(tableId, rowKey, filter), new ApiFunction<Row, Result>() { @Override public Result apply(Row row) { return Adapters.ROW_ADAPTER.adaptResponse(row); } }, MoreExecutors.directExecutor()); } DataClientVeneerApi(BigtableDataClient delegate); @Override BulkMutationWrapper createBulkMutation(String tableId); @Override BulkReadWrapper createBulkRead(String tableId); @Override ApiFuture<Void> mutateRowAsync(RowMutation rowMutation); @Override ApiFuture<Result> readModifyWriteRowAsync(ReadModifyWriteRow readModifyWriteRow); @Override ApiFuture<Boolean> checkAndMutateRowAsync(ConditionalRowMutation conditionalRowMutation); @Override ApiFuture<List<KeyOffset>> sampleRowKeysAsync(String tableId); @Override ApiFuture<Result> readRowAsync(
      String tableId, ByteString rowKey, @Nullable Filters.Filter filter); @Override ResultScanner readRows(Query request); @Override ApiFuture<List<Result>> readRowsAsync(Query request); @Override void readRowsAsync(Query request, StreamObserver<Result> observer); @Override void close();  }
@Test public void testReadRowAsync() throws Exception { when(mockDataClient.readRowAsync(TABLE_ID, ROW_KEY, null)) .thenReturn(ApiFutures.immediateFuture(MODEL_ROW)); Result actualResult = dataClientWrapper.readRowAsync(TABLE_ID, ROW_KEY, null).get(); assertResult(EXPECTED_RESULT, actualResult); verify(mockDataClient).readRowAsync(TABLE_ID, ROW_KEY, null); }