强迫FileNotFoundException
-
03-07-2019 - |
题
我正在写一测试用于一块代码IOException抓住它,我想盖。Try/赶上看起来是这样的:
try {
oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
} catch (IOException e) {
LOGGER.error("Bad news!", e);
} finally {
最简单的方法似乎使FileOutputStream扔FileNotFoundException,但是或许我会约这个全错误的方式。
有人有什么建议吗?
解决方案
来自你的评论:
是的,我想问题应该是 真的是“如何创造一个 两个Linux上都不存在的文件 和Windows?“在Windows上,我可以使用 'new File(" X:/")',其中X:是一个驱动器 不存在的信件。在Linux上, 这不起作用,因为那是一个 有效的文件名。
查看java.io.File.createTempFile。使用它来创建文件,然后将其删除。
可能会传递类似:
File tempFile;
tempFile = createTempFile(getClass().getName(),
Long.toString(System.currentTimeMillis());
tempFile.delete();
这应该以平台的方式为您提供一个独特的名称,您可以安全地使用它,而不必担心它存在。
其他提示
您可以将 cacheFileName
设置为无效名称或您知道不存在的名称。
有两个部分的任何试验:得到它的发生和测量,你得到了正确的结果。
注入故障
最简单的答案是一个已经提到的,这是设置 cacheFileName
一个文件,该文件将永远不会存在。这可能是最实际的回答,在这种情况。
然而,到导致任意的条件,如一个 IOException
, 什么你真的想要的是 注入故障.这种力量的故障,在你的代码没有强迫你仪器源代码。这里有一些方法,这样做:
- 模拟对象 你可以用工厂的方法,以创建一个复盖
ObjectOutputStream
或FileOutputStream
.在测试码的执行将引发IOException
当你想到,在生产码将不修改的正常行为。 - 依赖注射 为了得到你的嘲笑对象的合适的地方你可以使用一个框架,例如 弹簧 或 缝 "注入"适当的对象入类做的工作。你可以看到,这些框架即便有一个优先事项的对象将注,以便在单元测试你可以替代的产物体试验的对象。
- 面向方面编程 而不是结构的改变你的代码,可以使用AOP注入故障在正确的地方。例如,使用 模型或许 你可以定义 切入点 在那里你想要发异常,并有 咨询意见 扔所需的例外。
还有其他的答案错误注入Java;例如,一个产品叫 AProbe 开创了什么可以称为AOP在C久前,他们还有一个Java产品。
验证
变得异常引发一个良好的开端,但是你也必须验证你得到了正确的结果。假定代码样本,你有没有正确的,你想来验证你会记录,例外。有人以上提到使用模拟对象对于你的记录,这是一个可行的选择。你也可以使用AOP在这里抓到呼叫要记录仪。
我假定是记录器 log4j;为了解决类似的问题,我执行我自己的log4j存放器其捕获log4j输出:我只捕获 ERROR
和 FATAL
, ,这很可能是令人感兴趣的日志的消息,在这样的情况。该存放器是引用 log4j.xml
而是活在试运行捕捉错误记录输出。这基本上是一个模拟对象,但是我没有必要重组所有我的代码中有一个log4j Logger
.
我正在为一段代码编写测试 其中有一个IOException catch 我试图报道。
我不完全确定我理解你的目标,但是如果你想测试是否抛出异常,你可以告诉测试你希望它抛出异常:
@Test(expected=IOException.class)
如果未抛出异常,您的测试将失败,如果抛出异常则成功(例如,如果 cacheFileName
文件不存在)。
FileNotFoundException显然会触发catch。 javadoc说明了它将被抛出的情况。
您还应该考虑ObjectOutputStream构造函数可以抛出IOException,因此可能希望在测试中涵盖这种情况。
两种简单的方法是将cacheFileName设置为不存在的文件,或将指定的文件设置为只读访问。
-John
作为代码目前是书面的,你可以尝试拟出错误()呼吁记录仪的对象,查看如果它被称为当你希望IOException.
你的的愿望,以测试可能已经发现了一个根本问题的代码,因为它的编写。错误发生,但没有布尔或标志的价值(集的文件以一种特殊的模式)提供的其他章节的代码,以确定如果编写的文件是成功的。如果这是包含在一个功能,也许你可以返回布尔或设定一个目级别的变量。
cacheFileName = "thisFileShouldNeverExistAndIfItDoesYouAreScrewingUpMyTests";
当然,您可以采取措施并通过箍跳以编程方式确保文件名永远不会存在,或者您可以使用在99.99999%的情况下永远不会存在的字符串。
我希望这就是你的意思。
if(new File(cachedFile).exists()) {
oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
//do your code here
} else {
throw new FileNotFoundException("File doesn't exist!");
}