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

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

最佳答案

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

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

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

<小时/> 更新
结果发现使用了错误的导入。 import org.easymock.Mock 应替换为 import org.mockito.Mock;

关于java - 在java中使用mockito测试sql查询时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37024712/

相关文章:

ruby - rspec模拟与其他模拟框架的优缺点是什么?

java - JButton 将按钮文本设置为变量

java - 使用 DataStream API 进行批处理的 Flink Consumer - 我们如何知道何时停止以及如何停止处理 [ 2 倍 ]

java - 模拟接口(interface)存储库

java - 在测试类中调用没有参数的测试方法

java - 我们可以模拟第三方对象的创建或调用吗?

java - 从 Mysql 下载带有 url 的图像到自定义 ListView

java - 在左子右兄弟树中查找第一个元素

java - Junit Test 通用接口(interface) java

unit-testing - 你如何 mock 密封类(class)?