Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制FileNotFoundException_Java_Junit_Testing_Ioexception_Filenotfoundexception - Fatal编程技术网

Java 强制FileNotFoundException

Java 强制FileNotFoundException,java,junit,testing,ioexception,filenotfoundexception,Java,Junit,Testing,Ioexception,Filenotfoundexception,我正在为一段代码编写一个测试,该代码中有一个IOException捕获,我正试图涵盖它。try/catch如下所示: try { oos = new ObjectOutputStream(new FileOutputStream(cacheFileName)); } catch (IOException e) { LOGGER.error("Bad news!", e); } finally { 最简单的方法似乎是让FileOutputStream抛出一个FileNotFoun

我正在为一段代码编写一个测试,该代码中有一个IOException捕获,我正试图涵盖它。try/catch如下所示:

try {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
} catch (IOException e) {
    LOGGER.error("Bad news!", e);
} finally {
最简单的方法似乎是让FileOutputStream抛出一个FileNotFoundException,但也许我的方法是错误的

有人有什么建议吗?

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

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

我正在为一段代码编写测试 里面有一个异常捕获 我想掩盖的

我不完全确定我是否理解您的目标,但如果您想测试是否引发异常,您可以告诉测试您希望它引发异常:

@Test(expected=IOException.class)
然后,如果没有抛出异常,测试将失败;如果像cacheFileName文件不存在那样抛出异常,测试将成功

我正在为一段代码编写测试 里面有一个异常捕获 我想掩盖的

我不完全确定我是否理解您的目标,但如果您想测试是否引发异常,您可以告诉测试您希望它引发异常:

@Test(expected=IOException.class)

如果没有抛出异常,您的测试将失败;如果像cacheFileName文件不存在一样抛出异常,您的测试将成功。

FileNotFoundException显然会触发捕获。javadoc说明了抛出它的情况


您还应该考虑ObjutOutsPosiver构造函数可以抛出一个IOExExt,以便在测试中覆盖这个情况。

一个FieloToFunExtExpCp显然会触发catch。javadoc说明了抛出它的情况


您还应该考虑ObjutOutsStudio构造函数可以抛出一个IOExExt,以便可以在测试中覆盖此情况。

< P>两个简单的方法是将一个不存在的文件设置为CaseFrimeNeNe,或者将指定的文件设置为只读访问。
-John

两种简单的方法是将cacheFileName设置为不存在的文件或将指定的文件设置为只读访问


-John

在当前编写代码时,您可以尝试模拟LOGGER对象上的错误调用,并检查它是否在预期IOException时被调用


您对测试的渴望可能已经揭示了代码编写时的一个基本问题。出现错误,但没有布尔值或标志值将文件名设置为特殊模式,该模式提供其他代码段以确定写入文件是否成功。如果这包含在函数中,可能您可以返回布尔值或设置对象级变量。

在当前编写代码时,您可以尝试模拟LOGGER对象上的错误调用,并检查是否在预期IOException时调用它

您对测试的渴望可能已经揭示了代码编写时的一个基本问题。出现错误,但没有布尔值或标志值将文件名设置为特殊模式,该模式提供其他代码段以确定写入文件是否成功。如果这包含在函数中,可能您可以返回布尔值或设置对象级变量。

从您的注释:


是的,我想问题应该是这样的 真的一直以来我是如何创建一个 两个Linux上都不存在的文件 窗户呢?在windows上,我可以使用 “new FileX:/”,其中X:是驱动器 不存在的字母。在Linux上, 这不起作用,因为这是一个错误 有效的文件名

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

可能会通过类似于:

File tempFile;

tempFile = createTempFile(getClass().getName(), 
                          Long.toString(System.currentTimeMillis());
tempFile.delete();
这将以独立于平台的方式为您提供一个唯一的名称,您可以安全地使用它,而不必担心它的存在。

您的评论:

cacheFileName = "thisFileShouldNeverExistAndIfItDoesYouAreScrewingUpMyTests";

是的,我想问题应该是这样的 真的一直以来我是如何创建一个 两个Linux上都不存在的文件 窗户呢?在windows上,我可以使用 “new FileX:/”,其中X:是驱动器 不存在的字母。在Linux上, 这不起作用,因为这是一个错误 有效的文件名

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

可能会通过类似于:

File tempFile;

tempFile = createTempFile(getClass().getName(), 
                          Long.toString(System.currentTimeMillis());
tempFile.delete();
这将以独立于平台的方式为您提供一个唯一的名称,您可以安全地使用它,而不必担心它的存在

cacheFileName = "thisFileShouldNeverExistAndIfItDoesYouAreScrewingUpMyTests";
当然,你可以采取步骤和跳转通过编程来确保文件名永远不会存在,或者你可以使用99.99999%的情况下永远不会存在的字符串


当然,你可以采取步骤,通过编程来确保文件名永远不存在,或者你可以使用99.99999%的情况下永远不存在的字符串。

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

断层注入 最简单的答案是t 他已经提到了一个,就是将cacheFileName设置为一个永远不存在的文件。在这种情况下,这可能是最实际的答案

但是,要引起IOException之类的任意条件,您真正想要的是。这会强制代码中出现错误,而不会强制您插入源代码。以下是一些执行此操作的方法:

模拟对象您可以使用工厂方法创建重写的ObjectOutputStream或FileOutputStream。在测试代码中,当您需要时,实现将抛出IOException,而在生产代码中,实现不会修改正常行为。 依赖项注入为了将模拟对象放在正确的位置,您可以使用一个框架,例如或,将适当的对象注入正在进行工作的类中。您可以看到,这些框架甚至对将被注入的对象具有优先级,因此在单元测试期间,您可以使用测试对象覆盖生产对象。 您可以使用AOP将错误注入到正确的位置,而不必改变代码的结构。例如,使用您可以定义一个您希望抛出异常的位置,并让抛出者抛出所需的异常。 Java上的错误注入还有其他答案;例如,一个名为“先锋”的产品很早以前就可以在C中称为AOP,他们也有一个Java产品

验证 抛出异常是一个良好的开端,但您还必须验证是否得到了正确的结果。假设您的代码示例是正确的,您希望验证您是否记录了该异常。上面有人提到为您的记录器使用模拟对象,这是一个可行的选择。您还可以在这里使用AOP捕捉对记录器的调用


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

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

断层注入 最简单的答案是前面提到的,即将cacheFileName设置为永远不存在的文件。在这种情况下,这可能是最实际的答案

但是,要引起IOException之类的任意条件,您真正想要的是。这会强制代码中出现错误,而不会强制您插入源代码。以下是一些执行此操作的方法:

模拟对象您可以使用工厂方法创建重写的ObjectOutputStream或FileOutputStream。在测试代码中,当您需要时,实现将抛出IOException,而在生产代码中,实现不会修改正常行为。 依赖项注入为了将模拟对象放在正确的位置,您可以使用一个框架,例如或,将适当的对象注入正在进行工作的类中。您可以看到,这些框架甚至对将被注入的对象具有优先级,因此在单元测试期间,您可以使用测试对象覆盖生产对象。 您可以使用AOP将错误注入到正确的位置,而不必改变代码的结构。例如,使用您可以定义一个您希望抛出异常的位置,并让抛出者抛出所需的异常。 Java上的错误注入还有其他答案;例如,一个名为“先锋”的产品很早以前就可以在C中称为AOP,他们也有一个Java产品

验证 抛出异常是一个良好的开端,但您还必须验证是否得到了正确的结果。假设您的代码示例是正确的,您希望验证您是否记录了该异常。上面有人提到为您的记录器使用模拟对象,这是一个可行的选择。您还可以在这里使用AOP捕捉对记录器的调用


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

我希望这就是您的意思

if(new File(cachedFile).exists()) {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
    //do your code here
} else {
    throw new FileNotFoundException("File doesn't exist!");
}

我希望这就是你的意思

if(new File(cachedFile).exists()) {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
    //do your code here
} else {
    throw new FileNotFoundException("File doesn't exist!");
}

是的,我想问题应该是如何创建一个在Linux和Windows上都不存在的文件?在windows上,我可以使用“new FileX:/”,其中X:是不存在的驱动器号。在Linux上,这不起作用,因为这是一个有效的文件名
对*或?等文件无效的字符。是的,我想问题应该是如何创建Linux和Windows上都不存在的文件?在windows上,我可以使用“new FileX:/”,其中X:是不存在的驱动器号。在Linux上,这不起作用,因为这是一个有效的文件名。请使用对*或?等文件无效的字符。谢谢。我之前已经试过了,但是看起来FileOutputStream正在自动创建文件。事实证明,我在测试中使用了一个helper方法,该方法自动创建了file.file.createTempFileprefix,后缀将始终为JVM执行创建一个唯一的文件,无论使用相同的参数调用它多少次。因此,在调用该方法时,您不必担心指定唯一的名称。。。考虑到javadoc,我无法100%确定。如果您想绝对确保该文件不会由另一个测试创建:作为一种改进,与其删除临时文件,不如在rw模式下使用RandomAccessFile在其上获取独占锁,然后获取getChannel.lock。确保在测试结束时在finally块中解锁并删除。@Kevin不依赖于平台吗?在Unix上,文件锁定是建议性的,而在Windows上则是强制性的。谢谢。我之前已经试过了,但是看起来FileOutputStream正在自动创建文件。事实证明,我在测试中使用了一个helper方法,该方法自动创建了file.file.createTempFileprefix,后缀将始终为JVM执行创建一个唯一的文件,无论使用相同的参数调用它多少次。因此,在调用该方法时,您不必担心指定唯一的名称。。。考虑到javadoc,我无法100%确定。如果您想绝对确保该文件不会由另一个测试创建:作为一种改进,与其删除临时文件,不如在rw模式下使用RandomAccessFile在其上获取独占锁,然后获取getChannel.lock。确保在测试结束时在finally块中解锁并删除。@Kevin不依赖于平台吗?在Unix上,文件锁定是建议性的,而在Windows上则是强制性的。这毫无意义。FileOutputStream创建一个文件。如果op想要创建一个文件,那么检查文件是否存在是没有意义的。这没有意义。FileOutputStream创建一个文件。如果op想要创建一个文件,那么检查文件是否存在是没有意义的。