如何使用mockito/powermockito为单元/集成测试触发ioexception

gg58donl  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(599)

我正在对下面的代码段进行测试,我很难让这个方法抛出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);
}
bt1cpqcv

bt1cpqcv1#

唯一的情况是 CharArrayReader::read 投掷 IOException 是流关闭的时间。在你的例子中,这似乎是不可能的。
然而,如果你真的想得到100%的覆盖率,或者只是想确保你的类在意外情况下的行为,我的建议是为你的读者创建一个工厂,例如:

class ReaderFactory {
    Reader create(String content) {
        return new CharArrayReader(content.toCharArray());
    }
}

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

9wbgstp7

9wbgstp72#

在图书馆里看书的时候 CharArrayReader 班级 IOExceptionchar[] buff 构造函数中的参数为 null .

private void ensureOpen() throws IOException {
    if (buf == null)
        throw new IOException("Stream closed");
}

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

相关问题