无法使用junit测试异常

时间:2011-02-11 18:52:32

标签: java exception testing junit

我有一个包含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") 

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您正在尝试测试在某些条件下抛出CustomException,那么您应该测试抛出异常的代码,而不是捕获它的代码。在你的例子中,我猜你未定义的“fileLoader”是你期望抛出异常的东西吗?

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

答案 3 :(得分:0)

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

ClassToTest myInstance = new ClassToTest(myLogger);

// then, in your unit test
verify(myLogger).log("my log message")

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