【问题标题】:Unable to test exception with junit无法用junit测试异常
【发布时间】:2011-02-11 18:52:32
【问题描述】:

我有一个包含 try-catch 块的方法,但我不知道如何让我的测试通过...

这是我的代码:

public class ClassToTest {
    public void loadFileContent() {
        try {
            InputStream fileStream = fileLoader.loadFileContent();
            fileContentReader = new BufferedReader(new InputStreamReader(fileStream));
        } catch(CustomException ce) {
            logger.log(Level.SEVERE, "Error message")
        }
    }
}

public class TestClassToTest {
    @Test
    (expected = CustomException.class)
    public void testCustomException() throws Exception {
        loadFileContent();
    }
}

当抛出异常时,我唯一想做的就是记录它,一切都很好,但是,我如何创建一个显示它有效的测试?

我试图捕获控制台输出和

assertTrue(consoleOutput.contains("logMessgae") 

只要我只运行那个特定的测试用例,它就可以工作,但是当我在我的测试套件中运行它时它就不起作用了。

【问题讨论】:

    标签: java exception testing junit


    【解决方案1】:

    该方法的约定是捕获 CustomException 并将“错误消息”记录到外部组件:记录器。因此,您应该创建一个模拟记录器,将其提供给 ClassToTest 实例,测试该方法并验证模拟记录器是否已使用正确的参数调用。

    我个人使用 EasyMock(及其“classextension”扩展)来模拟具体类,但还有其他模拟框架。阅读http://easymock.org/EasyMock3_0_Documentation.html 了解有关 EasyMock 和一般模拟的信息。

    【讨论】:

    • 我从 EasyMock 开始,但最近更喜欢 Mockito,它基于 EasyMock,但扩展后具有更大的覆盖范围和更易于使用。查看mockito.org
    • @John,您应该为所有您认为有用的答案投票。 (包括您选择接受的。)
    【解决方案2】:

    如果没有模拟文件,您的代码将无法测试。您可以通过模拟外部依赖项并使用依赖项注入(即通过guice)来使此代码更具可测试性。

    【讨论】:

      【解决方案3】:

      如果您尝试测试在特定条件下是否引发了 CustomException,那么您应该测试引发异常的代码,而不是捕获它的代码。在您的示例中,我猜您未定义的“fileLoader”是您期望抛出异常的?

      如果您尝试测试是否捕获了异常并且事情继续顺利运行,那么您需要重新设计 ClassToTest 以便可以注入可能引发异常的类的模拟实现。那个模拟实现总是会抛出异常。然后,您可以在测试中运行 ClassToTest 并断言表明它正确处理了异常的任何条件。

      【讨论】:

        【解决方案4】:

        我认为正确的方法是将您的记录器传递到您的类中,如果您使用像 Mockito 这样的模拟框架,您可以使用verify 验证您的记录器:

        ClassToTest myInstance = new ClassToTest(myLogger);
        
        // then, in your unit test
        verify(myLogger).log("my log message")
        

        这里的关键是传递您的依赖项,以便您可以验证与它们的交互。

        【讨论】:

          猜你喜欢
          • 2011-01-28
          • 1970-01-01
          • 2013-02-19
          • 1970-01-01
          • 2020-05-13
          • 2015-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多