【问题标题】:Stubbing/Mocking a private method存根/模拟私有方法
【发布时间】:2014-06-24 21:12:43
【问题描述】:

我目前正在测试一种方法updateIssuesTable()。此方法是私有 void 方法。更糟糕的是,这个方法内部是对getConnection()的调用,它返回一个Connection,并且依赖于几个私有变量,这些私有变量依赖于一个初始化方法,而初始化方法当然依赖于其他东西。

长话短说,这行代码: Connection conn = getConnection();

我根本不想执行,我只需要一个模拟的连接来继续执行。下面是测试方法:

public void testUpdateIssuesTable() throws Exception {
        PatchWriterTask task = new PatchWriterTask();

        String sql = "update val_issues set PATCH_CREATION_INFO = ? where VAL_ISSUE_ID = ?";
        when(task1.getConnection()).thenReturn(conn);
        when(conn.prepareStatement(sql)).thenReturn(updateStatement);
        Whitebox.invokeMethod(task, "updateIssuesTable");
    }

我测试的方法如下:

    private void updateIssuesTable() throws SQLException {

            PreparedStatement createStatement = null;
            String sql = "update val_issues set PATCH_CREATION_INFO = ? where VAL_ISSUE_ID = ?";
            Connection conn = getConnection();
            createStatement = conn.prepareStatement(sql);
            ...
    }

编辑:我在我的测试类中创建了一个模拟连接:

private Connection conn = mock(Connection.class);

【问题讨论】:

  • 您最好在程序的主类中创建Connection 对象。在您想使用它的每个类的方法()中,call that method of Main Class which would return an instance of the Connection Object!
  • 这个方法仍然需要建立连接,通过调用像getConnection()这样的方法。我不太确定您的建议是什么,或者为什么会有所帮助。
  • 其实我没看懂你说的mocking是什么意思?对不起,如果你觉得我在不知情的情况下发表评论感到内疚!但是,我认为您每次可能只需要一个 Connection 对象来连接。再次为这样的错误道歉!

标签: java junit mockito white-box


【解决方案1】:

您应该从连接池中获取连接(C3P0 或 Tomcat 连接池是不错的选择),然后您可以模拟 ConnectionPool.getConnection() 方法以返回模拟连接。

除此之外,请查找 @RunWith MockitoJUnitRunner 示例,以展示如何将 @InjectMocks 放入测试类。这里没有捷径——只要你知道怎么做就很容易,但需要一点时间才能掌握。

【讨论】:

    猜你喜欢
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2018-07-17
    • 2023-03-18
    • 2014-10-15
    相关资源
    最近更新 更多