Stubbing / Mocking私有方法

时间:2014-06-24 21:12:44

标签: java junit mockito white-box

我目前正在测试方法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);

1 个答案:

答案 0 :(得分:0)

您应该从连接池获得连接(C3P0或Tomcat连接池是很好的候选者),然后您可以模拟ConnectionPool.getConnection()方法以返回模拟连接。

除了查看@RunWith MockitoJUnitRunner示例之外,还要展示如何将@InjectMocks引入您的测试类。这里没有捷径 - 当你知道怎么做但很容易掌握时,它很容易。