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

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

我正在对下面的代码段进行测试,我很难让这个方法抛出ioexception,这样我就可以获得100%的覆盖率。我曾试图嘲笑chararrayreader和stringwriter类,但没有成功。非常感谢您的帮助!
要测试的类

  1. public static final String getValue(String content) {
  2. if (content == null) return null;
  3. CharArrayReader reader = new CharArrayReader(content.toCharArray());
  4. StringWriter writer = new StringWriter();
  5. try {
  6. int c;
  7. while ((c = reader.read()) != -1) {
  8. if (isChinese((char)c)) {
  9. writer.write(c);
  10. } else {
  11. if ( (char)c > 0x20 && (char)c < 0x7f ) {
  12. writer.write(c);
  13. } else {
  14. writer.write(' ');
  15. }
  16. }
  17. }
  18. } catch (IOException e) {
  19. return null;
  20. } finally {
  21. reader.close();
  22. }
  23. return writer.toString();
  24. }

我的尝试

  1. @Test
  2. public void getValue_Exception() throws IOException {
  3. String content = "asd";
  4. char[] chara = null;
  5. CharArrayReader reader = mock(CharArrayReader.class);
  6. when(content.toCharArray()).thenReturn(chara);
  7. when(reader.read()).thenThrow(IOException.class);
  8. StringWriter writer = mock(StringWriter.class);
  9. doThrow(IOException.class).when(writer).write(anyInt());
  10. spyController.getValue(content);
  11. }
bt1cpqcv

bt1cpqcv1#

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

  1. class ReaderFactory {
  2. Reader create(String content) {
  3. return new CharArrayReader(content.toCharArray());
  4. }
  5. }

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

9wbgstp7

9wbgstp72#

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

  1. private void ensureOpen() throws IOException {
  2. if (buf == null)
  3. throw new IOException("Stream closed");
  4. }

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

相关问题