首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尽管抛出了相同的异常,但对预期异常的JUnit测试还是失败了

尽管抛出了相同的异常,但对预期异常的JUnit测试还是失败了
EN

Stack Overflow用户
提问于 2017-05-27 04:19:31
回答 1查看 3.4K关注 0票数 2

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

代码语言:javascript
运行
复制
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;
}

这是我的单元测试:

代码语言:javascript
运行
复制
@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);
    }
}

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

代码语言:javascript
运行
复制
    e.printStackTrace();
    throw e;

我还尝试过使用注释@Test(expected=IOException.class)和@Rule方法。两人都没通过考试。我尝试过用@SpringBootTest (如上面所示)和@RunWith(springjunit4classrunner.class).来注释我的测试我真的很茫然。我知道这个错误

代码语言:javascript
运行
复制
java.lang.AssertionError: Expected exception: java.io.IOException

但我的堆栈追踪是

代码语言:javascript
运行
复制
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)

这伤了我的心。这并不是什么大问题,也不会影响我的代码在生产中的性能,但我想了解为什么会发生这种情况。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-27 04:30:22

嗯,我觉得有点傻,因为我刚发完这篇文章,就解决了自己的问题。我没有仔细检查堆栈跟踪:

代码语言:javascript
运行
复制
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,永远不会得到抛出的异常!

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44212928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档