Mockito的论点捕获者:一个方法名称,两个方法定义(第2部分)



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

我正在使用PowerMockito从构造函数中返回printwrite。我需要模拟其打印方法。

我正在跟踪有四种打印/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>);

通过正常长时间测试打印来钻探,我发现呼叫打印(长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();

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

,而不是尝试模拟打印作者,只需使用一个真实的文字,而不是写入内存,而不是将其写入文件。

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
PrintWriter fakePrintWriter = new PrintWriter(byteArrayOutputStream);
// invoke method on unit under test
assertThat(bytes.toString()).isEqualTo(expectedOutput);

我已经尝试了ByteArrayOutputStream方法,并且在运行bytes.toString()时似乎是空的。我发现,如果您不介意在测试中实现实现,我发现以下内容似乎有效:

StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
...
assertThat(printWriter.getBuffer().toString()).isEqualTo(expectedOutput);

相关内容

  • 没有找到相关文章