如何解决如何使用 Mockito/PowerMockito 触发单元/集成测试的 IOException
我正在对以下代码进行测试,但我无法让此方法抛出 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);
}
解决方法
CharArrayReader::read
抛出 IOException
的唯一情况是流关闭时。在您的示例中,这似乎是不可能的。
尽管如此,如果您真的想获得 100% 的覆盖率,或者只是确保您的类在意外情况下正常运行,我的建议是为您的读者创建一个工厂,例如:
class ReaderFactory {
Reader create(String content) {
return new CharArrayReader(content.toCharArray());
}
}
有了这个类,您就可以在代码中使用它并模拟 create
方法。这样您就可以控制测试用例中使用的 Reader
实例。
在 CharArrayReader
类内部读取时,当构造函数中的 IOException
参数为 char[] buff
时抛出 null
。
private void ensureOpen() throws IOException {
if (buf == null)
throw new IOException("Stream closed");
}
一种方法(即使模拟 String 类是一个坏主意)是模拟从 toCharArray()
类调用方法 String
以返回 null
值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。