首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Mockito/PowerMockito触发IOException进行单元/集成测试

如何使用Mockito/PowerMockito触发IOException进行单元/集成测试
EN

Stack Overflow用户
提问于 2021-07-09 09:57:15
回答 2查看 51关注 0票数 0

我正在对下面的代码进行测试,我在让这个方法抛出一个IOException时遇到了问题,这样我就可以获得100%的覆盖率。我曾尝试模拟CharArrayReader和StringWriter类,但都无济于事。将非常感谢您的帮助!

要测试的类

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

我的尝试

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

回答 2

Stack Overflow用户

发布于 2021-07-09 15:19:49

CharArrayReader::read抛出IOException的唯一场景是在流关闭时。在您的示例中,这似乎是不可能的。

然而,如果你真的想得到100%的覆盖率,或者只是确保你的类在意外情况下的行为,我的建议是为你的阅读器创建一个工厂,例如:

代码语言:javascript
复制
class ReaderFactory {
    Reader create(String content) {
        return new CharArrayReader(content.toCharArray());
    }
}

有了这个类,您就可以在代码中使用它并模拟create方法。这样,您就可以控制在测试用例中使用的Reader实例。

票数 0
EN

Stack Overflow用户

发布于 2021-07-10 12:13:24

CharArrayReader类内部读取时,如果构造函数中的char[] buff参数为null,则会引发IOException

代码语言:javascript
复制
private void ensureOpen() throws IOException {
    if (buf == null)
        throw new IOException("Stream closed");
}

一种方法(即使模拟String类是个坏主意)是模拟String类中的toCharArray()方法调用,以返回一个null值。

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

https://stackoverflow.com/questions/68310389

复制
相关文章

相似问题

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