おしりんブログ

新人PGおしりんの色々まとめるよブログ

Mockito使ってみた。

あっという間に休日終わった~
来週資格受ける予定だけど大丈夫かな~心配。


今週はJUnitMockitoを使ってひたすら単体テストをしたり
JMeterを使って作成したメソッドが機能しているかとか
HTTPレスポンスの内容を確認したりしてたよ。

JMeterの方は先週から引き続き、ですな。


JUnitについては前々回くらいにまとめたので
今日はMockitoとJMeterについてまとめたいと思うよ~

記事分けようかな~悩むな~


ではではMockitoについて


Mockitoすごい!本当にすごい!
Mockitoなしでテストとか出来るの!?ってくらい便利。


・モックとは

 モックライブラリでは、ユニットテストをする際、
 テスト対象のクラスAが別のクラスBに依存している場合に、
 クラスBをクラスB自身の実装に依存しないmock(ハリボテ)として生成し、
 更にそのメソッドの戻り値を任意に設定するという事ができます。
 
 これにより
 「クラスBがこういう状態でこういう値を戻す場合の、クラスAのテスト」
 を容易に書くことができる。
 

 こんな感じ
 
 Hoge hoge = mock(Hoge.class);
 when(hoge.getFuga(anyInt())).thenReturn(-1); // どんな数が来ても -1 を返す
 when(hoge.getFuga(1)).thenReturn(100); // ただし、1の時は100を返す
 when(hoge.getFuga(2)).thenReturn(null); // ただし、2の時はnullを返す

 任意の戻り値、設定してますな~ 
 

 特に、外部のデータベースを使用したり、Webサービスにアクセスするテストを行う際、
 依存関係にある相手が未実装だったり、テスト環境からは接続不可だったりして
 システムを実行することが出来ない!という時に、
 
 いかにも本来の連携相手であるかのように振る舞う仮のオブジェクト(モック)
 を生成し、擬似的な仮実装を施し、テストを行うことができる。


例えばこんなクラスがあるとする。

public class Apple {
 public String judgeApple(String searchWord) {
 String resultApple = isApple(searchWord);
 if(resultApple){
  return "りんごです。"
 }else{
  return "NOTりんごです。"
 }
}

public boolean isApple(String searchWord) {
 // searchWordに該当するリンゴが存在するか
 // ヒット件数(resul)を返す処理
 if(result == 0){
  return false;
 }else{
  return true;
 }
}


で、judgeAppleのテストがしたいとする

public class AppleTest {
 @Test
 public void リンゴを取得する_searchWordがりんごの場合() {
 Apple sut = new Apple();
 String actual = sut.judgeApple("青りんご");
 String expected = "りんごです。"

 assertThat(actual, is(expected));
 }
}

って書くけど、もしまだDBアクセスが未実装だったら?
DBにまだ何も値が入っていなかったら?
テストができない!困った!って時に、Mockオブジェクトを生成する!

public class AppleTest {
 @Test
 public void リンゴを取得する_searchWordがりんごの場合() {
 Apple sut = spy(new Apple()){
  @Override
  public boolean isApple(){
   return true;
  };
 };
 String actual = sut.judgeApple("青りんご");
 String expected = "りんごです。"

 assertThat(actual, is(expected));
 }
}

Appleクラスをモックオブジェクト化して、
isApple()をオーバーライドして強制的にtrueを返すようにしたよ
こうすることで、isApple()が未実装でも、judgeテストをテストすることができるのだ!


サラッとspyが出てきたけど、
spy生成したオブジェクトは、ある特定の部分だけをモック化できるという優れもの。

今回みたいに、テストしたいメソッド
今はテストしなくていいけど、テストしたいメソッドの中で呼ばれてしまうメソッド
同じクラスに定義されている時にお役立ちになるかも。説明わかりにく!


when()の中に指定できるメソッドは、
モックオブジェクトとして生成したオブジェクトの持つメソッドのみ
っていう規約があったり(当たり前か)

インスタンス生成した時、同時にオーバーライドを宣言しなきゃいけなかったり
はじめのとっかかりに少し戸惑ったけど
まあ慣れればらくちんにテストが進められる。


先輩たちもMockito最強って言ってたから間違いない!何かと!


privateメソッドとかまでモック化できちゃう
もっとすごいモックライブラリがあるらしいけど、
なんていう名前か忘れてしまった(´・ω・`)


ちょっと記事の量が多くなっちゃったから一旦おわり。
Mockitoについてでした~(他のモックライブラリとの比較とかしてないや…)