我正在写一测试用于一块代码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, 什么你真的想要的是 注入故障.这种力量的故障,在你的代码没有强迫你仪器源代码。这里有一些方法,这样做:

  • 模拟对象 你可以用工厂的方法,以创建一个复盖 ObjectOutputStreamFileOutputStream.在测试码的执行将引发 IOException 当你想到,在生产码将不修改的正常行为。
  • 依赖注射 为了得到你的嘲笑对象的合适的地方你可以使用一个框架,例如 弹簧 "注入"适当的对象入类做的工作。你可以看到,这些框架即便有一个优先事项的对象将注,以便在单元测试你可以替代的产物体试验的对象。
  • 面向方面编程 而不是结构的改变你的代码,可以使用AOP注入故障在正确的地方。例如,使用 模型或许 你可以定义 切入点 在那里你想要发异常,并有 咨询意见 扔所需的例外。

还有其他的答案错误注入Java;例如,一个产品叫 AProbe 开创了什么可以称为AOP在C久前,他们还有一个Java产品。

验证

变得异常引发一个良好的开端,但是你也必须验证你得到了正确的结果。假定代码样本,你有没有正确的,你想来验证你会记录,例外。有人以上提到使用模拟对象对于你的记录,这是一个可行的选择。你也可以使用AOP在这里抓到呼叫要记录仪。

我假定是记录器 log4j;为了解决类似的问题,我执行我自己的log4j存放器其捕获log4j输出:我只捕获 ERRORFATAL, ,这很可能是令人感兴趣的日志的消息,在这样的情况。该存放器是引用 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!");
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top