2016-01-21 148 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