首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制FileNotFoundException

强制FileNotFoundException
EN

Stack Overflow用户
提问于 2009-03-02 23:10:56
回答 9查看 2.3K关注 0票数 1

我正在为一段代码写一个测试,这段代码中有一个我想要覆盖的IOException catch。try/catch如下所示:

代码语言:javascript
复制
try {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
} catch (IOException e) {
    LOGGER.error("Bad news!", e);
} finally {

最简单的方法似乎是让FileOutputStream抛出一个FileNotFoundException,但也许我做错了这件事。

有谁有什么建议吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-03-02 23:37:04

从你的评论中:

是的,我想问题应该是“如何创建一个在Linux和Windows上都不存在的文件?”在windows上,我可以使用'new File(" X: /")',其中X:是一个不存在的驱动器号。在Linux上,这不起作用,因为这是一个有效的文件名。

看看java.io.File.createTempFile吧。使用它创建文件,然后将其删除。

可能会传递类似如下的内容:

代码语言:javascript
复制
File tempFile;

tempFile = createTempFile(getClass().getName(), 
                          Long.toString(System.currentTimeMillis());
tempFile.delete();

这应该会以一种与平台无关的方式给你一个唯一的名字,你可以安全地使用它,而不用担心它的存在。

票数 4
EN

Stack Overflow用户

发布于 2009-03-02 23:13:12

您可以将cacheFileName设置为无效的名称或您知道不存在的名称。

票数 5
EN

Stack Overflow用户

发布于 2009-03-03 01:51:53

任何测试都有两个部分:让它发生和测量你得到了正确的结果。

故障注入

最简单的答案就是前面已经提到的,那就是将cacheFileName设置为一个永远不会存在的文件。在这种情况下,这可能是最实用的答案。

但是,要造成任意条件,比如IOException,您真正想要的是Fault Injection。这会强制在代码中出现错误,而不会强制您对源代码进行检测。以下是几种实现此目的的方法:

  • Mock objects您可以使用工厂方法来创建被覆盖的ObjectOutputStreamFileOutputStream。在测试代码中,实现将在您想要的时候抛出模拟,而在生产代码中,为了将模拟对象放在正确的位置,不会修改普通的behavior.
  • Dependency注入。您可以使用诸如SpringSeam之类的框架将适当的对象“注入”到正在执行工作的类中。您可以看到,这些框架甚至具有将被注入的对象的优先级,因此在单元测试期间,您可以使用测试objects.
  • 覆盖生产对象,而不是完全更改代码的结构,您可以使用AOP在正确的位置注入错误。例如,使用AspectJ,您可以定义一个希望引发异常的Pointcut,并让Advice抛出所需的异常。

对于Java上的错误注入,还有其他的解决方案;例如,一个名为AProbe的产品在很久以前就开创了C语言中可以称为面向方面编程的先河,而且他们也有一个Java产品。

验证

获得抛出的异常是一个很好的开始,但您还必须验证您是否获得了正确的结果。假设您在那里拥有的代码示例是正确的,您想要验证您是否记录了该异常。上面提到的人为你的记录器使用Mock对象,这是一个可行的选择。您还可以在这里使用AOP来捕获对记录器的调用。

我假设记录器是log4j;为了解决类似的问题,我实现了自己的log4j附加器,它捕获log4j输出:我专门只捕获ERRORFATAL,在这种情况下,它们可能是有趣的日志消息。附加器在log4j.xml中被引用,并在测试运行期间激活以捕获错误日志输出。这本质上是一个模拟对象,但我不必重新构造所有获得log4j Logger的代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/604449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档