Используйте doReturn для частичной симуляции статического метода с PowerMockito - PullRequest
10 голосов
/ 12 сентября 2011

Как использовать шаблон doReturn в PowerMockito для макетирования статического метода, когда я не могу использовать Mockito.when ()?

Я хочу проверить следующий статический метод:

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

Это мой метод testMethod:

@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, потому что метод вызовет исключение при передачеmock 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);

}

Ответы [ 2 ]

4 голосов
/ 05 мая 2014

Попробуйте

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

3 голосов
/ 16 сентября 2011

Заменить эту строку кода:

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

с

 doReturn(expected).when(IOHelper.class);
 IOHelper.openWriter(fos,charset, true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...