【问题标题】:Mockito- mocking database callsMockito - 模拟数据库调用
【发布时间】:2014-03-26 01:16:25
【问题描述】:

我尝试使用返回用户详细信息的 Mockito 模拟以下方法。

它是对数据库进行实际调用,而不是返回模拟结果。

我的方法-

public User getUserById(String userId){
    if (userId == null) {
        throw new IllegalArgumentException("AssociateId cannot be null");
    }
    User user = new User();
    preparedStatement = null;
    try {
        connection = dbConnection.openConnection(properties, inputStream);
        query = queryReader
                .getQuery(RelationshipManagerConstants.selectUser);
        preparedStatement = connection.prepareStatement(query);
        preparedStatement.setString(I_User.associateId, userId);
        resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            user.setAssociateId(resultSet.getString(I_User.associateId));
            user.setAssociatePassword(resultSet
                    .getString(I_User.associatePassword));
            user.setAssociateRole(resultSet.getInt(I_User.associateRole));
            user.setAssociateIsActive(resultSet
                    .getBoolean(I_User.associateIsActive));
            user.setAssociateEmail(resultSet
                    .getString(I_User.associateEmail));
        }
    } catch (ClassNotFoundException e) {
        LOGGER.warning("Cannot return User Details. ClassNotFoundException occured.");
    } catch (SQLException e) {
        LOGGER.warning("Cannot return User Details. SQLException occured.");
    } catch (IOException e) {
        LOGGER.warning("Cannot return User Details. IOException occured.");
    } finally {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                LOGGER.warning("Failed to close resultSet.");
            }
        }
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                LOGGER.warning("Failed to close statement.");
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                LOGGER.warning("Failed to close connection.");
            }
        }
    }
    return user;
}

我的测试-

@Test
public void testGetUserById() throws Exception {
    mockConnection = Mockito.mock(Connection.class);
    Properties mockProperties =  Mockito.mock(Properties.class);
    InputStream mockInputStream = Mockito.mock(InputStream.class);
    DBConnection mockDbConnection = Mockito.mock(DBConnection.class);
    PreparedStatement mockPreparedStatement = Mockito.mock(PreparedStatement.class);
    ResultSet mockResultSet = Mockito.mock(ResultSet.class);
    QueryReader mockQueryReader = Mockito.mock(QueryReader.class);


    PowerMockito.whenNew(DBConnection.class).withNoArguments()
    .thenReturn(mockDbConnection);
    PowerMockito.whenNew(QueryReader.class).withNoArguments()
    .thenReturn(mockQueryReader);


    String query = "select * from User where AssociateID=?;";
    Mockito.when(mockDbConnection.openConnection(mockProperties, mockInputStream)).thenReturn(mockConnection);
    Mockito.when(mockQueryReader.getQuery("sqlScript_selectUser.sql")).thenReturn("query");
    Mockito.when(mockConnection.prepareStatement("query")).thenReturn(mockPreparedStatement);
    Mockito.when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet);
    Mockito.when(mockResultSet.next()).thenReturn(true);

    Mockito.when(mockResultSet.getString(1)).thenReturn("message");
    User u=userDAO.getUserById("AB1234");
    assertEquals("EX112233", u.getAssociateId());
}

我的测试应该失败,因为我正在返回“消息”但是,我用“EX112233”断言

但它正在调用数据库而不是模拟。

提前致谢。

【问题讨论】:

  • 您是否考虑过使用内存数据库来测试您的 DAO?这个测试被模拟太重了,不容易支持..
  • 我认为你最好为这种方法编写集成测试而不是单元测试。

标签: java database unit-testing mockito


【解决方案1】:

您准备好 UserDAO 以在 PowerMockito using @PrepareForTest 中进行测试了吗?

请记住,您需要准备调用 new DBConnection()new QueryReader() 的类,以使这些构造函数存根生效。

【讨论】:

  • 是的。我确实准备了 My UserDAO
  • 人力资源部。如果您正在这样做,并使用 PowerMockRunner 运行测试,那么我不确定根据您发布的代码我有什么更好的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多