@Test
  public void testRead() throws IOException {
    onTableGet(basicTableSchema());

    TableDataList dataList = rawDataList(rawRow("Arthur", 42));
    onTableList(dataList);

    try (BigQueryTableRowIterator iterator =
        BigQueryTableRowIterator.of(
            mockClient, BigQueryIO.parseTableSpec("project:dataset.table"))) {

      Assert.assertTrue(iterator.hasNext());
      TableRow row = iterator.next();

      Assert.assertTrue(row.containsKey("name"));
      Assert.assertTrue(row.containsKey("answer"));
      Assert.assertEquals("Arthur", row.get("name"));
      Assert.assertEquals(42, row.get("answer"));

      Assert.assertFalse(iterator.hasNext());

      verifyTableGet();
      verifyTabledataList();
    }
  }
  @Test
  public void testReadOpenFailure() throws IOException {
    thrown.expect(RuntimeException.class);

    when(mockClient.tables()).thenReturn(mockTables);
    when(mockTables.get(anyString(), anyString(), anyString())).thenReturn(mockTablesGet);
    when(mockTablesGet.execute()).thenThrow(new IOException("No such table"));

    try (BigQueryTableRowIterator iterator =
        BigQueryTableRowIterator.of(
            mockClient, BigQueryIO.parseTableSpec("project:dataset.table"))) {
      try {
        Assert.assertFalse(iterator.hasNext()); // throws.
      } finally {
        verifyTableGet();
      }
    }
  }
  @Test
  public void testReadEmpty() throws IOException {
    onTableGet(basicTableSchema());

    // BigQuery may respond with a page token for an empty table, ensure we
    // handle it.
    TableDataList dataList = new TableDataList().setPageToken("FEED==").setTotalRows(0L);
    onTableList(dataList);

    try (BigQueryTableRowIterator iterator =
        BigQueryTableRowIterator.of(
            mockClient, BigQueryIO.parseTableSpec("project:dataset.table"))) {

      Assert.assertFalse(iterator.hasNext());

      verifyTableGet();
      verifyTabledataList();
    }
  }