2

昨天我问了一个类似的问题,其中我使用了一个方法名称,但是我传递了两个不同的参数。这个不涉及共享父类的参数类型。

我正在使用 PowerMockito 从构造函数返回 PrintWrite。我需要模拟它的打印方法。

我正在跟踪四种 print/println 调用:

print(long l)
print(java.lang.String s) 
print(char c)
println()

特别是我关心的是打印很长的那个。我有以下设置:

Mockito.doNothing().when(fakePrintWriter).println();
Mockito.doNothing().when(fakePrintWriter).print(any(Long.class));
Mockito.doNothing().when(fakePrintWriter).print(any(String.class));
Mockito.doNothing().when(fakePrintWriter).print(any(Character.class));

通过以下验证,我想通过以下方式捕获某些参数:

Mockito.verify(fakePrintWriter, Mockito.times(11)).print(outputCaptor.capture());
Mockito.verify(fakePrintWriter, Mockito.times(1)).print(longPrintCaptor.capture());
Mockito.verify(fakePrintWriter, Mockito.times(9)).print(eq(','));
Mockito.verify(fakePrintWriter, Mockito.times(3)).println();

这给了我耳光:

Wanted but not invoked:
printWriter.print(<Capturing argument>);

通过在 long 上正常测试打印进行深入研究,我发现调用 print(long l) 实际上是调用 println。所以,我改为将我的长打印设置/验证更改为:

Mockito.doNothing().when(fakePrintWriter).println(any(Long.class));
...
Mockito.verify(fakePrintWriter, Mockito.times(1)).println(longPrintCaptor.capture());

这给了我与 println 的冲突:

Argument(s) are different! Wanted:
printWriter.println(<Capturing argument>);
...
Actual invocation has different arguments:
printWriter.println();
...

Expected :printWriter.println(<Capturing argument>);
Actual   :printWriter.println();

就像昨天一样,我不知道如何解决这个问题-我考虑使用自定义答案来跟踪输出的字符串(我想验证正在输出的值的实际顺序),但我相信这样做只会导致类似的错误。关于做什么的任何想法?

4

2 回答 2

1

与其尝试模拟 PrintWriter,不如简单地使用一个真实的,写入内存而不是文件。

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
PrintWriter fakePrintWriter = new PrintWriter(byteArrayOutputStream);

// invoke method on unit under test

assertThat(bytes.toString()).isEqualTo(expectedOutput);
于 2013-06-21T12:12:45.847 回答
0

我已经尝试过这种ByteArrayOutputStream方法,当我运行时它似乎是空的bytes.toString()。如果您不介意在测试中允许实现,我发现以下内容似乎可行:

StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
...
assertThat(printWriter.getBuffer().toString()).isEqualTo(expectedOutput);
于 2015-12-12T00:50:23.813 回答