Io 使用PowerMockito模拟经过修饰的流

Io 使用PowerMockito模拟经过修饰的流,io,inputstream,powermock,outputstream,word-wrap,Io,Inputstream,Powermock,Outputstream,Word Wrap,所以我有一个类,它在构造函数中接受OutputStream,并在方法中从中创建一个PrintWriter。问题是如何让这个PrintWriter验证它 Example public Class(OutputStream output) {} public void foo() { PrintWriter writer = new PrintWriter(output); } 我想做的是: PrintWriter writer = PowerMockito.mock(PrintWriter.

所以我有一个类,它在构造函数中接受OutputStream,并在方法中从中创建一个PrintWriter。问题是如何让这个PrintWriter验证它

Example public Class(OutputStream output) {}
public void foo() {
  PrintWriter writer = new PrintWriter(output);
}
我想做的是:

PrintWriter writer = PowerMockito.mock(PrintWriter.class)
PowerMockito
    .whenNew(PrintWriter.class)
    .withArguments(output)
    .thenReturn(writer);

然而,我得到的是,没有与这位作家的互动。任何帮助都将不胜感激。

如果您使用PowerMock配置提供完整的代码片段将更好。然后我可以帮你并给你建议,现在我可能只能猜出什么是错的,但我正在努力:

PrintWriter
有几个构造函数可以接受
OutputStream
,而PowerMock有一个缺陷,当类重载构造函数时只传递参数时,它可能会错误地猜测被模拟的构造函数

还有一个常见的错误,您没有将创建
PrintWriter
实例的类添加到
@PrepareForTest

因此,在我的假设案例的基础上进行了示例:

public class PrintWriterCreator {

    private final PrintWriter printWriter;

    public PrintWriterCreator(OutputStream outputStream) {
        this.printWriter = new PrintWriter(outputStream);
    }

    public void write(String message){
        printWriter.write(message);
    }
}
测试等级:

@RunWith(PowerMockRunner.class)
@PrepareForTest({PrintWriter.class, PrintWriterCreator.class})
public class PrintWriterCreatorTest {


    @Mock
    private OutputStream outputStream;

    @Mock
    private PrintWriter printWriterMock;

    private PrintWriterCreator printWriterCreator;


    @Before
    public void setUp() throws Exception {

        whenNew(PrintWriter.class).withParameterTypes(OutputStream.class).withArguments(eq(outputStream)).thenReturn
                                                                                                       (printWriterMock);

        printWriterCreator = new PrintWriterCreator(outputStream);
    }

    @Test
    public void testWrite() throws Exception {
        String message = "someMessage";
        printWriterCreator.write(message);

        verifyNew(PrintWriter.class).withArguments(outputStream);

        verify(printWriterMock).write(eq(message));
    }


}