我有一个包含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")
并且只要我只运行那个特定的测试用例就可以工作,但是当我在我的测试套件中运行它时它没有用。
答案 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")
这里的关键是传递您的依赖关系,以便您可以验证与它们的交互。