【问题标题】:How do I force call a SQLException when Unit Testing in Java?在 Java 中进行单元测试时如何强制调用 SQLException?
【发布时间】:2018-06-11 22:02:47
【问题描述】:

我正在 JUnit 4.xx 上运行 Java 测试。我正在尝试从 try 块中强制运行 SQLException。我以许多不同的方式运行了 Mockito,但我没有得到我想要的结果。

这是我的主文件:

public boolean close()   {

    if (connection == null) {
        throw new IllegalStateException("Connection never initialized!");
    }

    try {
        connection.close();
        return true;
    }

    catch (SQLException e)
    {
        LOGGER.logp(Level.INFO, CLASS_NAME, "close", e.getMessage());
        return false;
    }

}

这是我的测试文件:

@Test
public void testFail2() throws SQLException {

    JDBCConnection spyConnect = mock(JDBCConnection.class);

    given(spyConnect.getConnection()).willAnswer(invocationOnMock -> new SQLException());

    assertFalse(spyConnect.close());
}

总之,我如何让 catch 块得到执行,以便为我的整个程序获得 100% 的行覆盖率? 提前感谢您的帮助。

【问题讨论】:

    标签: java unit-testing junit mockito sqlexception


    【解决方案1】:

    如果你想让你的模拟抛出异常,你应该使用willThrow,而不是willAnswer:

    given(spyConnect.getConnection()).willThrow(new SQLException());
    

    【讨论】:

    • 这不起作用,因为 SQLException 是一个检查异常。我必须使用 lambda 表达式才能工作,而 willAnswer 允许 lambda 表达式。
    • @SandeepNamburi willThrow 可以处理已检查的异常,但是在重新阅读您的问题之后,有些事情对我来说并不重要。如果你想测试JDBCConnection,你为什么嘲笑它?
    • 我正在将我的代码和单元测试添加到无法访问数据库的管道中。因此,一切都需要被嘲笑。
    • @SandeepNamburi 你这里有错误的想法 - 你不能测试你模拟的课程。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2018-12-06
    • 2016-06-29
    • 2010-11-26
    • 1970-01-01
    • 2019-02-22
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多