【问题标题】:Use doReturn to partially mock static method with PowerMockito使用 doReturn 通过 PowerMockito 部分模拟静态方法
【发布时间】:2011-09-12 17:46:42
【问题描述】:

当我不能使用 Mockito.when() 时,如何使用 PowerMockito 中的 doReturn 模式来模拟静态方法?

我想测试以下静态方法:

public static PrintWriter openWriter(File file, Charset charset, boolean autoflush) throws FileNotFoundException {
      return openWriterHelper(new FileOutputStream(file), charset, autoflush);
   }

这是我的测试方法:

@Test
public void testOpenWriter_file_charset_autoflush() throws Throwable {
      Charset charset = mock(Charset.class);
      PrintWriter expected = mock(PrintWriter.class);
      File file = mock(File.class);
      FileOutputStream fos = mock(FileOutputStream.class);

      spy(IOHelper.class);
      whenNew(FileOutputStream.class).withArguments(file).thenReturn(fos);
      when(IOHelper.openWriterHelper(fos, charset, true)).thenReturn(expected);

      PrintWriter observed = IOHelper.openWriter(file, charset, true);
      assertEquals(expected, observed);

      verifyStatic();
      IOHelper.openWriterHelper(fos, charset, true);

}

问题是我不能将 openWriterHelper 放在对 when 的调用中,因为该方法在传递模拟 OutputStream 时会引发异常。

如果重要的话,这是 openWriterHelper 的代码:

public static PrintWriter openWriterHelper(OutputStream stream, Charset charset,
                                    boolean autoflush) {
  return new PrintWriter(new java.io.BufferedWriter(
        new java.io.OutputStreamWriter(stream, charset)), autoflush);

}

【问题讨论】:

    标签: mockito powermock


    【解决方案1】:

    试试

    doReturn(expected).when(IOHelper.class, "openWriterHelper", file, charset, true);
    

    when(IOHelper.class, "openWriterHelper", file, charset, true).thenReturn(expected);
    

    查看示例: http://code.google.com/p/powermock/source/browse/trunk/modules/module-test/powermockito/junit4/src/test/java/samples/powermockito/junit4/partialmocking/StaticPartialMockingTest.java?r=1366

    【讨论】:

      【解决方案2】:

      替换这行代码:

      when(IOHelper.openWriterHelper(fos, charset, true)).thenReturn(expected);
      

       doReturn(expected).when(IOHelper.class);
       IOHelper.openWriter(fos,charset, true);
      

      【讨论】:

      • 真的吗?将其拆分为 2 个语句?我不明白,在尝试这个时,我得到“检测到未完成的存根”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多