2

私は昨日、同じような質問をしました。そこでは、単一のメソッド名を使用していますが、2 つの異なる引数を渡しています。これには、親クラスを共有する引数の型は含まれません。

PowerMockito を使用して、コンストラクターから PrintWrite を返しています。その印刷方法をモックする必要があります。

私が追跡している 4 種類の 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 をテストしてドリルダウンすると、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 をモックしようとする代わりに、File ではなくメモリに書き込む本物のライターを使用してください。

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 に答える