繁体   English   中英

使用 mockito 测试 DriverManager.getConnection

[英]Test DriverManager.getConnection with mockito

我写了 DAO 类

public List<ClassRoom> getAllClassRooms() {
    List<ClassRoom> classRoomsList = new ArrayList<>();
    String sqlStatement = "SELECT * FROM university.classrooms;";
    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    try {
        connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/Exam6", "postgres", "Navlanart1");
        try {
            statement = connection.prepareStatement(sqlStatement);
            try {
                resultSet = statement.executeQuery();
                while (resultSet.next()) {
                    ClassRoom classRoom = new ClassRoom(resultSet.getString("name"));
                    classRoomsList.add(classRoom);
                }
            } catch (SQLException e) {
            } finally {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return classRoomsList;
}

现在我想通过这样的课程来测试它

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.powermock.api.easymock.PowerMock.mockStatic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.core.classloader.annotations.PrepareForTest;

import com.kolosok.university.dao.ClassRoomDao;

@RunWith(MockitoJUnitRunner.class)
@PrepareForTest(DriverManager.class)
public class TestClassRoomDao {

@Mock
Connection mockConnection;

@Mock
PreparedStatement mockPreparedStatement;

@Mock
ResultSet mockResultSet;

@Test
public void testGetAllClassRooms() throws SQLException {

    mockStatic(DriverManager.class);

    when(DriverManager.getConnection(anyString(), anyString(), anyString())).thenReturn(mockConnection);
    when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement);
    when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet);
    when(mockResultSet.next()).thenReturn(Boolean.FALSE);

    ClassRoomDao classRoomDao = new ClassRoomDao();
    classRoomDao.getAllClassRooms();

    verify(mockConnection, times(1)).prepareStatement(anyString());
    verify(mockPreparedStatement, times(1)).executeQuery();
    verify(mockResultSet, times(1)).next();
}

}

但它不起作用。

java.sql.SQLException: No suitable driver found for 
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at     com.kolosok.university.TestClassRoomDao.testGetAllClassRooms(TestClassRoomDao.java:58)

我阅读了很多关于类似问题的 stackOverFlow 答案。 但仍然无法解决我的问题

我正在使用

postgresql-42.0.0.jre7.jar

mockito-all-1.10.19.jar

powermock-api-easymock-1.6.6.jar

powermock-core-1.6.6.jar

cglib-nodep-3.1.jar

javassist-3.12.1.GA.jar

objenesis-2.5.jar

powermock-api-mockito-1.6.6.jar

powermock-api-support-1.6.6.jar

easymock-3.4.jar

我认为问题可能是您没有使用PowerMockRunner运行它,因此不遵守正在使用的PowerMock扩展(如mockStatic)

尝试将@RunWith(MockitoJUnitRunner.class)更改为@RunWith(PowerMockRunner.class)

编辑

您可能还需要初始化模拟。 最简单的方法是使用@Before方法,例如

@Before public void setup(){ initMocks(this); }

Class Cut{
public void abc(){
Connection conn = DriverManager.getConnection("url","username","password");
}
}


@PrepareForTest({Cut.class})
Class Cut_test{

cut classUnderTest;

public void abc_test(){

PowerMockito.mockStatic(DriverManager.class);
when(DriverManager.getConnection(anyString(),anyString(),anyString())).thenReturn(mockConnection);
 

//test the stub
Connection conn = DriverManager.getConnection("abc","abc","pass");

//call actual method 
classunderTest.abc();

//Assert
assertTrue("passed",true);

}
}

对于那些得到 nullpointerException 的人,

  1. 通过在 //test the stub 下添加行来检查存根是否正常工作。
  2. 在实际代码中注释掉你的 DriverManager.getConnection 。
  3. 替换为 //test 我在上面发布的存根。
  4. 然后在调试模式下运行测试方法,看看它是否到达实际方法。
  5. 如果没有到达,则在@PrepareForTest({KafkaRecordHandler.class}) 中添加实际方法的类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM