2016-01-21 162 views
3

我必須編寫一些單元測試,但我有模擬ResultSet和jdbc Connection的問題。如何在TestNG中使用Mockito模擬jdbc連接和resultSet

我有這樣的方法:

@Test 
public void test3() throws SQLException, IOException { 

    Connection jdbcConnection = Mockito.mock(Connection.class); 
    ResultSet resultSet = Mockito.mock(ResultSet.class); 

    Mockito.when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false); 
    Mockito.when(resultSet.getString(1)).thenReturn("table_r3").thenReturn("table_r1").thenReturn("table_r2"); 
    Mockito.when(jdbcConnection 
      .createStatement() 
      .executeQuery("SELECT name FROM tables")) 
      .thenReturn(resultSet); 

    //when 
    List<String> nameOfTablesList = null; 
    try { 
     nameOfTablesList = Helper.getTablesName(jdbcConnection); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    //then 
    Assert.assertEquals(nameOfTablesList.size(), 3); 
} 

和錯誤的顯示行executeQuery("SELECT name FROM tables")這聽起來像這樣:

java.lang.NullPointerException HelperTest.test3(HelperTest.java:71) 

任何想法什麼問題呢?

+0

你可能要考慮不是嘲笑的數據庫連接,但無論哪種隔離數據庫的API背後,所以你可以模擬該API,或者使用內存數據庫。 –

+0

順便說一句:你的測試表明'Helper.getTablesName'做了什麼['DatabaseMetaData.getTables'](http://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getTables- java.lang.String-java.lang.String-java.lang.String-java.lang.String:A-)用於 –

回答

10

您需要在jdbcConnection.createStatement()上創建期望

默認情況下,我相信會返回一個null

應改爲類似:

ResultSet resultSet = Mockito.mock(ResultSet.class); 
Mockito.when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false); 
Mockito.when(resultSet.getString(1)).thenReturn("table_r3").thenReturn("table_r1").thenReturn("table_r2"); 

Statement statement = Mockito.mock(Statement.class); 
Mockito.when(statement.executeQuery("SELECT name FROM tables")).thenReturn(resultSet); 

Connection jdbcConnection = Mockito.mock(Connection.class); 
Mockito.when(jdbcConnection.createStatement()).thenReturn(statement); 
+0

謝謝,我在想這個問題,但是我不知道如何解決這個問題。 – user3552976