まだまだテスト中だ。
とにかく、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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。