我昨天问了一个类似的问题,我在其中使用了一个方法名称,但是我经历了两个不同的参数。这个不涉及共享父类的参数类型。
我正在使用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);