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

对于预期异常的JUnit测试失败,尽管抛出了相同的异常

周阳波
2023-03-14

我在StackOverflow中搜索了相同类型的问题,并检查了每个响应,但仍然面临这个问题。我正在测试从名为readStream()的方法抛出的IOException,该方法确实抛出了IOException,但Junit使用AssertionException使测试失败。

private static StringBuilder readStream(InputStream inputStream) throws IOException {

    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();

    String line;

    try {
        while ((line = reader.readLine()) != null){
            stringBuilder.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
        throw e;
    }
   finally {
        try{
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return stringBuilder;
}

下面是我的单元测试:

@SpringBootTest(classes = RequestResponseUtility.class)
public class RequestResponseUtilityTest extends AbstractTest {

    @Mock
    private InputStream inputStream;

    @Test(expected = IOException.class)
    public void convertStreamToStringNullTest() throws IOException {

        RequestResponseUtility.convertStreamToString(inputStream);
    }
}

如您所见,我已经尝试让原始类中的异常实际抛出异常,而不是仅仅捕获并打印堆栈跟踪:

    e.printStackTrace();
    throw e;

我还尝试使用注释@test(expected=IOException.class)和@rule方法。两个测试都不及格。我试着用@SpringBootTest(如上面所见)和@RunWith(SpringJUnit4ClassRunner.class)来注释测试。我在这里真的是不知所措。我得到这个错误

java.lang.AssertionError: Expected exception: java.io.IOException

但我的堆栈跟踪是

java.io.IOException: Underlying input stream returned zero bytes
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:288)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at main.java.utilities.RequestResponseUtility.readStream(RequestResponseUtility.java:25)
    at main.java.utilities.RequestResponseUtility.convertStreamToString(RequestResponseUtility.java:45)

这让我心碎。这不是一个很大的问题,也不会影响我的代码在生产中的性能,但是我想知道为什么会发生这种情况。

共有1个答案

哈骞仕
2023-03-14

好吧,我觉得有点傻,因为我刚刚解决了我自己的问题后,我发布了这个。我没有足够仔细地检查堆栈跟踪:

at main.java.utilities.RequestResponseUtility.readStream(RequestResponseUtility.java:25)
        at main.java.utilities.RequestResponseUtility.convertStreamToString(RequestResponseUtility.java:45)
        at test.java.utilities.RequestResponseUtilityTest.convertStreamToStringNullTest(RequestResponseUtilityTest.java:42)

调用的第一个方法是convertStreamToStringNullTest(),我的单元测试。这将调用convertStreamToString()。但是,convertStreamToString()实际上在我的RequestResponseUtility类中调用了一个名为readStream()的私有帮助器方法。在我的问题中,我已经将代码发布到readStream(),因为我凭直觉知道异常是在那里被抛出的。

但是,当异常沿堆栈向下传播到convertStreamToString()时,我从不抛出异常。我只打印堆栈痕迹。因此它会被那个方法卡住,因此单元测试(正在“监听”convertStreamToString()中的IOException)永远不会得到抛出的异常!

这个故事的寓意是检查嵌套方法,并真正跟踪您的异常应该来自哪里!

 类似资料:
  • 这就是我的应用程序中测试的样子: 我怎样才能避免这种行为呢?

  • 问题内容: 嗨,有一个针对车辆构造函数的测试。该测试会在没有驾驶执照的情况下使用驾驶员对车辆进行初始化,并且应该抛出异常。代码构造函数: 代码测试: 当我运行此重点测试方法时,这就是结果。 -------------标准输出--------------- 吉恩正确的rijbewijs 因此,根据输出,捕获并显示了异常,但测试失败。有人知道为什么吗?提前致谢。 编辑:我通过不包括try-catch块

  • 问题内容: 我对JUnit还是很陌生,我真的不知道对于异常和异常处理有什么最佳实践。 例如,假设我正在为IPAddress类编写测试。它具有一个构造函数IPAddress(String addr),如果addr为null,则将抛出InvalidIPAddressException。据我可以从谷歌搜索中得知,对null参数的测试将如下所示。 在这种情况下,try / catch很有意义,因为我知道异

  • 我正试图为一个方法编写一个测试用例,该方法基于特定的逻辑抛出异常。然而,测试用例失败了,因为预期的异常和获得的异常是不同的。 我如何解决这个问题?

  • 我构建了一个有3个属性的帐户类:余额、所有者、acctNo。帐户类有2个构造函数,一个接受3个属性,一个不接受数据。帐户类有设置和获取方法以及存款和取款方法。 我还构建了一个类,该类从类扩展而来。将此类修改为类后,取款方法或此方法尝试将余额设置为零以下,将抛出。 JUnit测试人员修改测试方法,将尝试提取超过当前余额的可用,所以做测试方法。我需要修改JUnit测试透支帐户,以便它捕获异常,并捕获。

  • 我想测试某个异常是用作为JUnit测试方法的某个部分中的异常原因抛出的。 测试方法本身不应该抛出异常--只是它的一个特定部分。