我在StackOverflow中搜索了相同类型的问题,并检查了每个响应,但仍然面临这个问题。我正在测试从一个名为AssertionException. readStream()的方法中抛出的IOException,该方法确实抛出了IOException,但是Junit用一个Junit测试失败了
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)
这伤了我的心。这并不是什么大问题,也不会影响我的代码在生产中的性能,但我想了解为什么会发生这种情况。
发布于 2017-05-27 04:30:22
嗯,我觉得有点傻,因为我刚发完这篇文章,就解决了自己的问题。我没有仔细检查堆栈跟踪:
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,永远不会得到抛出的异常!
故事的寓意是检查嵌套的方法,并真正跟踪您的异常应该来自哪里!
https://stackoverflow.com/questions/44212928
复制相似问题