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

时间:2016-05-04 10:12:33

标签: java junit mocking mockito easymock

我想使用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);

1 个答案:

答案 0 :(得分:1)

setup方法的第一行外,测试看起来不错。

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

在mocks初始化之前调用conexion.createStatement()时抛出NPE。只需删除sentencia = conexion.createStatement();行,这里就是多余的。

<小时/> 的更新
原来,使用了错误的导入。 import org.easymock.Mock应替换为import org.mockito.Mock;