2016-05-04 96 views
1

我想用EasyMock,Mock或Mockito測試java中的下一個函數。 我想測試當我調用leerCantPueblos()函數時,查詢(「SELECT conarpueblos()」)被執行。使用java中的mockito測試sql查詢時出錯

private void leerCantPueblos(){ 
     cantPueblosBD = leerBD.cantidadPueblos(); 
     try { 
      while(cantPueblosBD.next()){ 
       CANTIDADPUEBLOS = cantPueblosBD.getInt("contarpueblos"); 
      } 
     } catch (SQLException e) {e.printStackTrace();} 
    } 

這個函數調用cantidadPueblos(),這是下一個函數。

public ResultSet cantidadPueblos() { 
     try { 
      sentencia = conexion.createStatement(); 
      ResultSet cantidadPueblos = sentencia.executeQuery("SELECT contarpueblos()"); 
      return cantidadPueblos; 
     } catch (SQLException e) {} 

     return null; 
    } 

我嘗試下一個JUnit測試,但會引發NullPointerException異常

package tests; 

import java.sql.Connection; 
import java.sql.SQLException; 
import java.sql.Statement; 

import org.easymock.Mock; 
import org.junit.Before; 
import org.junit.Test; 
import org.mockito.InjectMocks; 
import org.mockito.Mockito; 
import org.mockito.MockitoAnnotations; 

import server.ConexionBD; 

public class TestBD { 

    @InjectMocks 
     ConexionBD conexionDB; 

     @Mock 
     Connection conexion; 

     @Mock 
     Statement sentencia; 

     @Before 
     public void setup() throws SQLException { 
      MockitoAnnotations.initMocks(this); 
      //Mockito.initMocks(this); 
      Mockito.when(conexion.createStatement()).thenReturn(sentencia); 
     } 

     @Test 
     public void cantidadPueblos_shouldExecuteQuery() throws SQLException { 
      conexionDB.cantidadPueblos(); 

      Mockito.verify(sentencia).executeQuery("SELECT contarpueblos()"); 
     } 
} 

下一行失敗:

Mockito.when(conexion.createStatement()).thenReturn(sentencia); 
+0

在conexion上調用createStatement時將返回sentencia,但sentencia永遠不會初始化。它是空的! –

+0

如何初始化?sentencia = null?或者我必須先創建聲明?我是JUnit和嘲笑的新手.. @RahulSharma –

+0

您能添加完整的測試代碼嗎?即類聲明,進口 – Evgeny

回答

1

測試尋找除setup方法的第一行的好。

public void setup() throws SQLException { 
    sentencia = conexion.createStatement(); 
    MockitoAnnotations.initMocks(this); 
    //Mockito.initMocks(this); 
    Mockito.when(conexion.createStatement()).thenReturn(sentencia); 
} 

它會拋出NPE爲conexion.createStatement()在模擬初始化之前被調用。只要刪除sentencia = conexion.createStatement();行,這裏是多餘的。


UPDATE
原來,使用了錯誤的導入。 import org.easymock.Mock應替換爲 import org.mockito.Mock;

+0

我在這裏得到空指針異常:Mockito.when(conexion.createStatement())。然後返回(sentencia);如果我刪除sentencia = conexion.createStatement()。我得到空指針異常。 @evgeny –

+0

@Asier'sentencia = conexion.createStatement();'不會導致NPE和'Mockito.when(conexion.createStatement())。thenReturn(sentencia);''造成它。你在問題中提供了最終測試版嗎? – Evgeny

+0

我現在把最終版本,當我執行它拋出java.lang.NullpointerException並在此下,它在TestBD.setup(TestBD.java:31),並且行31是Mockito.when ... @evgeny –