我正在对下面的代码进行测试,我在让这个方法抛出一个IOException时遇到了问题,这样我就可以获得100%的覆盖率。我曾尝试模拟CharArrayReader和StringWriter类,但都无济于事。将非常感谢您的帮助!
要测试的类
public static final String getValue(String content) {
if (content == null) return null;
CharArrayReader reader = new CharArrayReader(content.toCharArray());
StringWriter writer = new StringWriter();
try {
int c;
while ((c = reader.read()) != -1) {
if (isChinese((char)c)) {
writer.write(c);
} else {
if ( (char)c > 0x20 && (char)c < 0x7f ) {
writer.write(c);
} else {
writer.write(' ');
}
}
}
} catch (IOException e) {
return null;
} finally {
reader.close();
}
return writer.toString();
}我的尝试
@Test
public void getValue_Exception() throws IOException {
String content = "asd";
char[] chara = null;
CharArrayReader reader = mock(CharArrayReader.class);
when(content.toCharArray()).thenReturn(chara);
when(reader.read()).thenThrow(IOException.class);
StringWriter writer = mock(StringWriter.class);
doThrow(IOException.class).when(writer).write(anyInt());
spyController.getValue(content);
}发布于 2021-07-09 15:19:49
CharArrayReader::read抛出IOException的唯一场景是在流关闭时。在您的示例中,这似乎是不可能的。
然而,如果你真的想得到100%的覆盖率,或者只是确保你的类在意外情况下的行为,我的建议是为你的阅读器创建一个工厂,例如:
class ReaderFactory {
Reader create(String content) {
return new CharArrayReader(content.toCharArray());
}
}有了这个类,您就可以在代码中使用它并模拟create方法。这样,您就可以控制在测试用例中使用的Reader实例。
发布于 2021-07-10 12:13:24
在CharArrayReader类内部读取时,如果构造函数中的char[] buff参数为null,则会引发IOException。
private void ensureOpen() throws IOException {
if (buf == null)
throw new IOException("Stream closed");
}一种方法(即使模拟String类是个坏主意)是模拟String类中的toCharArray()方法调用,以返回一个null值。
https://stackoverflow.com/questions/68310389
复制相似问题