public synchronized ImmutableList<Struct> readTableRecords(String tableId, String... columnNames)
      throws IllegalStateException {
    return readTableRecords(tableId, ImmutableList.copyOf(columnNames));
  }
@Test
  public void testReadRecordsWithListOfColumnNamesShouldWorkWhenSpannerReadSucceeds()
      throws ExecutionException, InterruptedException {
    // arrange
    prepareTable();
    when(resultSet.next()).thenReturn(true).thenReturn(false);
    Struct struct =
        Struct.newBuilder()
            .set("SingerId")
            .to(int64(1))
            .set("FirstName")
            .to(string("Marc"))
            .set("LastName")
            .to(string("Richards"))
            .build();
    when(resultSet.getCurrentRowAsStruct()).thenReturn(struct);
    when(spanner.getDatabaseClient(any()).singleUse().read(any(), any(), any()))
        .thenReturn(resultSet);
    ImmutableList<String> columnNames = ImmutableList.of("SingerId", "FirstName", "LastName");

    // act
    ImmutableList<Struct> actual = testManager.readTableRecords("Singers", columnNames);

    // assert
    ImmutableList<Struct> expected = ImmutableList.of(struct);
    assertThat(actual).containsExactlyElementsIn(expected);
  }