我正在为一段代码写一个测试,这段代码中有一个我想要覆盖的IOException catch。try/catch如下所示:
try {
oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
} catch (IOException e) {
LOGGER.error("Bad news!", e);
} finally {最简单的方法似乎是让FileOutputStream抛出一个FileNotFoundException,但也许我做错了这件事。
有谁有什么建议吗?
发布于 2009-03-02 23:37:04
从你的评论中:
是的,我想问题应该是“如何创建一个在Linux和Windows上都不存在的文件?”在windows上,我可以使用'new File(" X: /")',其中X:是一个不存在的驱动器号。在Linux上,这不起作用,因为这是一个有效的文件名。
看看java.io.File.createTempFile吧。使用它创建文件,然后将其删除。
可能会传递类似如下的内容:
File tempFile;
tempFile = createTempFile(getClass().getName(),
Long.toString(System.currentTimeMillis());
tempFile.delete();这应该会以一种与平台无关的方式给你一个唯一的名字,你可以安全地使用它,而不用担心它的存在。
发布于 2009-03-02 23:13:12
您可以将cacheFileName设置为无效的名称或您知道不存在的名称。
发布于 2009-03-03 01:51:53
任何测试都有两个部分:让它发生和测量你得到了正确的结果。
故障注入
最简单的答案就是前面已经提到的,那就是将cacheFileName设置为一个永远不会存在的文件。在这种情况下,这可能是最实用的答案。
但是,要造成任意条件,比如IOException,您真正想要的是Fault Injection。这会强制在代码中出现错误,而不会强制您对源代码进行检测。以下是几种实现此目的的方法:
ObjectOutputStream或FileOutputStream。在测试代码中,实现将在您想要的时候抛出模拟,而在生产代码中,为了将模拟对象放在正确的位置,不会修改普通的behavior.对于Java上的错误注入,还有其他的解决方案;例如,一个名为AProbe的产品在很久以前就开创了C语言中可以称为面向方面编程的先河,而且他们也有一个Java产品。
验证
获得抛出的异常是一个很好的开始,但您还必须验证您是否获得了正确的结果。假设您在那里拥有的代码示例是正确的,您想要验证您是否记录了该异常。上面提到的人为你的记录器使用Mock对象,这是一个可行的选择。您还可以在这里使用AOP来捕获对记录器的调用。
我假设记录器是log4j;为了解决类似的问题,我实现了自己的log4j附加器,它捕获log4j输出:我专门只捕获ERROR和FATAL,在这种情况下,它们可能是有趣的日志消息。附加器在log4j.xml中被引用,并在测试运行期间激活以捕获错误日志输出。这本质上是一个模拟对象,但我不必重新构造所有获得log4j Logger的代码。
https://stackoverflow.com/questions/604449
复制相似问题