当前位置: 首页 > 知识库问答 >
问题:

在JUnit中捕获IOException

史弘致
2023-03-14

我想寻求帮助,了解如何在JUnit测试中捕获IOException,以测试我的代码在发生错误时是否会抛出正确的异常。

以下是我的主要代码

public void LogHostStream(String v_strText) {
    
    Date dtToday = new Date();
    SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
    String date = DATE_FORMAT.format(dtToday);
    
    SimpleDateFormat FILE_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
    String filedate = FILE_DATE_FORMAT.format(dtToday);
    
    IConfiguration cfgHandler = ConfigurationFactory.getConfigHandle();
    String logFileName = cfgHandler.GetXMLValue("config.xml", "/config/log/host_logs");
    
    String outText = String.format("%s \n %s \n", date, v_strText);
    String fileName = logFileName + "_" + filedate + ".txt";

    try (FileWriter fw = new FileWriter(fileName, true);
         BufferedWriter bw = new BufferedWriter(fw);) {
        bw.write(outText);
    } catch (IOException e) {
        e.printStackTrace();
    }

这是我的JUnit:

 @Test(expected = IOException.class)
public void testLogHostStreamThrowsIOException() throws IOException {
    logger.LogHostStream("");
    String logFileName = cfgHandler.GetXMLValue("ocomw_config.xml", "/config/log/host_logs");
    FileWriter fWriter = new FileWriter(logFileName, true);
    BufferedWriter bw = new BufferedWriter(fWriter);
           
    Assertions.assertThrows(IOException.class, () -> new BufferedWriter(bw));    
}

我想我必须在JUnit测试中创建一个错误的路径来抛出该异常,但我没能得到我想要的结果。我很感谢你的帮助。谢谢

共有2个答案

龙逸清
2023-03-14

调用断言是没有意义的。assertThrows(IOException.class,()-

您无法获得异常的原因是()-

如果您想测试您的方法以检查它是否抛出excpeted异常,您应该删除try-catch块,如下所示:

FileWriter fw = new FileWriter(fileName, true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(outText);

因为一旦捕获到异常,就无法使用断言检查异常。资产抛出

之后,您应该在ocomw\u config中更改/config/log/host\u logs的值。xml转换为无效的路径值。然后调用断言。assertThrows(IOException.class,()-

东门修能
2023-03-14

当无法创建或打开文件进行写入时,FileWriter将引发异常。实现这一点的一种方法是确保文件应该位于的目录不存在。此测试成功:

@Test
void testThrows() throws IOException {
    assertThrows(IOException.class, () -> new FileWriter("/no/such/place"));
}

创建BufferedWriter永远不会抛出IOException,这意味着此断言将始终失败:

assertThrows(IOException.class, () -> new BufferedWriter(bw));

不过,您不应该为FileWriterBufferedWriter编写测试:它们是经过良好测试的标准库类,您可以相信它们能按指定的方式工作。

 类似资料:
  • 我试图创建一个测试来验证我的代码(见下面的伪代码)是否正确捕获异常。我知道JUnit能够测试代码是否用以下代码抛出异常: 然而,我正在测试的软件的原始代码捕获了这个异常并打印了一条消息 JUnit是否有办法验证此消息?或者我应该改变一下我的流行语? 注:我已阅读,我应使用以下内容: 但是程序崩溃,因为它无法识别对象。 我尝试测试的方法的伪代码(出于隐私原因,不要发布确切的内容):

  • 问题内容: 我们有一个大型的golang应用程序,它使用记录器(实际上是自定义记录器)将输出写入定期轮换的日志文件中。 但是,当应用程序崩溃或出现panic()时,这些消息将变为标准错误。 有什么方法可以覆盖使用记录仪的紧急功能? 问题答案: 据我所知,您无法将恐慌的输出重定向到标准错误或记录器。最好的办法是将标准错误重定向到可以在外部或在程序内部执行的文件。 对于我的rclone程序,我重定向了

  • 在junit5和Mockito中如何覆盖返回void的方法的catch块。 下面提到的dump方法返回void并抛出RepositoryException和JSONException。 TidyJosnitemWrite.dump(节点,stringWriter,-1);

  • 问题内容: 我在游乐场中获得了以下代码: 因此很明显,该函数会引发错误: 执行被中断,原因:EXC_BAD_INSTRUCTION 有没有办法抓住这个?我在线阅读文章,为Array类编写一个下标,该下标始终检查范围,但问题更大:我无法捕捉任何东西吗? 问题答案: 在Swift中,您什么都做不到。您只能赶上 错误 与抛出由被称为目标C代码的其他银行代码或错误,类型NSError一套说法。 默认的数组

  • 问题内容: 我使用jQuery向服务器发出AJAX POST请求,该请求可以返回状态为302的HTTP响应。然后JavaScript只是将GET请求发送到此URL,而我想在此响应中将用户重定向到URL。这可能吗? 问题答案: 由于给出的原因,接受的答案不起作用。我发表了评论,并提供了一个指向问题的链接,该问题描述了一种黑客程序 但是,这有点肮脏,在深入研究之后,我发现我认为是更好的解决方案- 使用

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。