在 java 中使用 mockito 测试 sql 查询时出错

Error testing sql query using mockito in java

我想使用 EasyMock、Mock 或 Mockito 测试 java 中的下一个函数。 我想测试当我调用 leerCantPueblos() 函数时,查询 ("SELECT conarpueblos()") 是否被执行。

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);

除了 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(); 行,它在这里是多余的。


更新
原来是用错了import。 import org.easymock.Mock 应替换为 import org.mockito.Mock;