2016/06/28

[java?]doReturn()は複数書けるし、ArgumentCaptorは複数取得している

まだまだテスト中だ。
とにかく、Java自体に自信がないので、テストパターンを多く作りすぎているような気がする。
まあいいや(仕様変更が来ないことを祈ろう)。

 

テストするメソッドで、別のメソッドを呼んでいると扱いが面倒なので、spy()していちいちdoReturn()とかdoNothing()とか書いている。
しばらくやっていると、同じ引数で1回目と2回目で違う値を返さないといけないパターンが発生。
まあ、レスポンス解析だからありがちだと思う。

どうやったらいいか調べていたのだが、単にdoReturn()をずらずらつなげればよいみたいだ。

doReturn(new byte[] {1, 2, 3}).doReturn(new byte[] {4, 5, 6}).when(xx).read(anyInt());

ほほう。

 

あと、呼び出した疑似関数の引数をArgumentCaptorで保持する方法も知った。

ArgumentCaptor<byte[]> writeCaptor = ArgumentCaptor.forClass(byte[].class);
doNothing().when(xxx).write(writeCaptor.capture());

//テスト実施後
byte[] captorData = writeCaptor.getValue();
assertThat(Arrays.equals(captorData, COMPARE_DATA), is(true));

assertThat()で配列の比較方法がよくわからんので、もうArrays.equals()にしてしまったが、まあいいや。

 

この方法だと、captorDataには最後に呼び出したものが残るようですな。
複数回はできるのだろうか?
できるのだ。
java - Can Mockito capture arguments of a method called multiple times? - Stack Overflow

さすがだねぇ。
と思って試すが、なんか動かない。。。

ああ、書いてあるのが、ArgumentCaptorの生成とverify()が並んで書いてあったから、そういう書き方なのかと思ったけど、verify()はいつも通りテスト実施後に呼べばいいだけか。

ArgumentCaptor<byte[]> writeCaptor = ArgumentCaptor.forClass(byte[].class);
doNothing().when(xxx).write(writeCaptor.capture());

//テスト実施後
verify(xxx, times(4)).write(writeCaptor.capture());
List<byte[]> captorData = writeCaptor.getAllValues();
assertThat(Arrays.equals(captorData.get(2), COMPARE_DATA), is(true));

つまり、Captorは動いていて、取得方法だけ変えればよいというわけだ。
verify()は呼ばないとだめなようです。
times()できっちりじゃなくても、atLeast()でいけるみたいだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。