mockitoの簡単なチュートリアル


1 mockitoの概要


Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce clean verification errors.
Mockitoは非常に良いシミュレーションフレームワークです.これにより、きれいで簡単なAPIを使用して、きれいなテストを作成することができます.これらのテストは可読性が高く、明確な検証エラーが発生するため、Mockitoは迷惑をかけません.
公式説明-howプロファイル
mockito公式ドキュメント-詳細バージョン
特性と動機github説明
次のような機能があります.
  • mockの具体的なクラスとインタフェース;
  • 小注釈文法糖-@Mock
  • 検証エラーはクリーンです.スタック追跡をクリックして、テストで失敗した検証を表示します.「例外理由」をクリックして、コード内の実際のインタラクションに移動します.スタックトラッキングは常にクリーンです.
  • では、対話のたびに検証するのではなく、柔軟な検証を順番に行うことができる
  • .
  • は、正確な回数と最低1回の検証
  • をサポートします.
  • パラメータ整合器(anyObject()、anyString()、またはrefEq()を使用して反射に基づく等しい整合を行う)の柔軟な検証またはスタブ
  • .
  • は、カスタムパラメータ整合器の作成または既存のHamcrest整合器
  • の使用を可能にする.

    2 mockitoアプリケーション


    gradleウェアハウスの追加に関する構成は次のとおりです.
    repositories { jcenter() }
    dependencies { testCompile "org.mockito:mockito-core:2.+" }
    

    mavenの関連構成では、pomを追加する関連依存を検索できます.

    2.1相互作用の検証

    import static org.mockito.Mockito.*;
    
    // mock creation
    List mockedList = mock(List.class);
    
    // using mock object - it does not throw any "unexpected interaction" exception
    mockedList.add("one");
    mockedList.clear();
    
    // selective, explicit, highly readable verification
    verify(mockedList).add("one");
    verify(mockedList).clear();
    

    2.2スタブメソッド呼び出し

    // you can mock concrete classes, not only interfaces
    LinkedList mockedList = mock(LinkedList.class);
    
    // stubbing appears before the actual execution
    when(mockedList.get(0)).thenReturn("first");
    
    // the following prints "first"
    System.out.println(mockedList.get(0));
    
    // the following prints "null" because get(999) was not stubbed
    System.out.println(mockedList.get(999));
    

    2.3 mock注記使用

      public class ArticleManagerTest {
    
           @Mock private ArticleCalculator calculator;
           @Mock private ArticleDatabase database;
           @Mock private UserProvider userProvider;
    
           private ArticleManager manager;
    

    2.4コールバック

     when(mock.someMethod(anyString())).thenAnswer(
         new Answer() {
             public Object answer(InvocationOnMock invocation) {
                 Object[] args = invocation.getArguments();
                 Object mock = invocation.getMock();
                 return "called with arguments: " + Arrays.toString(args);
             }
     });
    
     //Following prints "called with arguments: [foo]"
     System.out.println(mock.someMethod("foo"));
     
    

    2.*その他


    詳細ドキュメントmockito公式ドキュメント-詳細バージョン

    3 verify

    Mockito vertify 、その具体的な作用は以下のようにまとめることができる.
  • メソッドが呼び出されたかどうかをテストします.
  • vervify(mock,times)の具体的な呼び出し回数.
  •  @Test
        public void update() throws Exception {
            boolean result = personService.update(1, "new name");
            // mockDao getPeron 
            verify(mockDao,never()).getPerson(1);
     				assertTrue("must true", result);
        		// getPerson(1)
        		verify(mockDao, times(1)).getPerson(eq(1));
        		// update
        		verify(mockDao, times(1)).update(isA(Person.class));
    }
    

    ただし、verifyの使用はmackオブジェクトに制限されており、通常のオブジェクトでは相関検出がサポートされていません.そうしないと、相関エラーがトリガーされます.
     Argument passed to verify() is of type RegistrationMgrActor and is not a mock!
    Make sure you place the parenthesis correctly!
    See the examples of correct verifications:
        verify(mock).someMethod();
        verify(mock, times(10)).someMethod();
        verify(mock, atLeastOnce()).someMethod();
    org.mockito.exceptions.misusing.NotAMockException: 
    Argument passed to verify() is of type RegistrationMgrActor and is not a mock!
    Make sure you place the parenthesis correctly!
    See the examples of correct verifications:
        verify(mock).someMethod();
        verify(mock, times(10)).someMethod();
        verify(mock, atLeastOnce()).someMethod();
    	at *******************
    1 test completed, 1 failed
    FAILURE: Build failed with an exception.
    * What went wrong:
    
    

    4 mockとspyの違い


    プロジェクトでは、あるサービスの返却結果を処理する必要がある関数もありますが、関数ユニットをテストするときにそれらのサービスを起動することはできません.ここではMockitoツールを利用することができます.MockitoのMockとSpyは、実際に呼び出されていないオブジェクトやメソッドをブロックし、カスタム動作を設定するために使用できます.両者の違いは、
    1、Mock宣言の対象は、関数の呼び出しに対してmock(すなわち虚偽の関数)を実行し、真の部分を実行しない.
    2、Spyが宣言したオブジェクトは、関数の呼び出しに対してすべて本当の部分を実行します.

    5 mockitoの使用アドバイス


    これは公式サイトで提供されているmockitoの使用メモです.
  • あなたが持っていないタイプをmockしないでください.
  • mock値オブジェクトを試みないでください.
  • すべてのものをmockしないでください.
  • テストで愛を表現します.

  • 以下は私のいくつかの悟りです.
  • 良いオブジェクト向けのビジネスコードはmockテストコードの作成にも役立ち、逆の悪いプロセスのコードはmockコードを書くプロセスを増加させます.そのため、論理を書くときは、どのように使いやすいかをよく考えたほうがいいです.これは関数の階層、パラメータ伝達に注意しなければならないことがたくさんあります.
  • 値結果に対する要求が比較的多いテスト内容については、mockではなく予想される構造を直接構築したほうがいいです.mockはテストプロセスに適していますが、すべてのものではありません.
  • 最初から書くことを学んでいましたが、テストが終わってから補うのではなく、ユニットテストを書く目的が全く達成されませんでした.私たちがユニットテストを書くのは最初から望んでいました.そんなに厳しくない環境の中で自分の論理を測ることができます.
  • 関数はあまり深くネストしないで、抽象的な公共方法をマスターします.
  • 静的ツールクラスメソッドの使用に特に注意すると、うまくいかないとテストコードを書く複雑さが増す可能性があります.