JUnitとmockito


バグのないコードを書くことを望んでいます.テストは不可欠な一環です.CIが継続的に統合され、私たちのコードを発表する過程で、多くのテスト方法があり、私たちのコードのカバー率を高め、漏れを調べることができます.
ユニットテスト
ユニットテストは、様々なテストの中で最も範囲の小さい機能ユニットをテストするために使用されます.ユニットテストでは、一般的に、所望の結果を返すことができるかどうかを検出する方法をテストします.理論的には、ユニットテストはメモリで行うべきであり、テストされたコードは、ネットワークへのアクセス、データベースへのアクセス、データの読み書き、他のスレッドへのアクセスを含む他の外部情報と理論的に対話すべきではない.
JUnit
アプリケーション全体を実行させる以外に、私たちの機能をテストするのに便利な方法を望んでいます.JUnitはこのようなフレームワークです.ユニットテストフレームワークがなければ、main関数でテストする過程は複雑で想像しにくいと考えています.一般的に、プロジェクトエンジニアリングにはtestフォルダがあります.私たちはすべてのテスト方法をこのフォルダの下に書きます.テスト方法の名前は関係ありませんが、私たちは一般的に分かりやすい名前をつけたほうがいいです.
使用方法
  • @Test注記:現在のメソッドがテストメソッドであることを示し、このメソッド
  • を実行できます.
  • @Before注記:現在のクラスで、すべてのメソッドが実行前にBefore注記で修飾されたメソッド
  • を実行することを示す.
  • @After注記:Beforeと同様に、各メソッドの実行が完了すると、このメソッド
  • が実行されます.
  • Assert:テストメソッドの一般的な戻り値はvoidです.Assertを使用します.assertTrue()などの方法で断言する
  • @Ignore注記:テスト方法がまだ完了していない場合は、この注記を使用して、統合時にこのテスト方法
  • を無視することができます.
  • @Test(expected=Exception.class):テスト後に所望の異常が投げ出されなかった場合、テストに失敗した
  • mockito
    テスト時に、いくつかのオーバーライド率指標に達する場合があります.または、オーバーライド率指標のためでなくても、テスト方法Aで他の方法Bが呼び出され、B方法が何らかの理由で呼び出されなかったり、B方法が呼び出されたくないという問題に直面します.テストを制御できるようにするメカニズムが必要です.テストしたい部分を自由にテストすることができます.mockitoは私たちがこの仕事を完成するのに役立つツールです.
    mockitoの主な役割は2つあります.
  • あるインスタンスのあるメソッドがテスト中に呼び出されたかどうか、呼び出された回数を検証する
  • .
  • あるインスタンスのあるメソッドの実際の実行内容をスキップして、私たちが設定した結果
  • に直接戻ります.
    mockitoはユニットテストの利器であり、ユニットテストはメソッド内部、最小ユニットのテストに専念していると述べ始めました.その中で、他のサービスに関連するメソッド呼び出しなどは避けられないかもしれません.mockitoを利用してこれらのステップをスキップすることができます.mockという単語の意味は虚偽で、愚弄であり、私たちは自分で作成した偽オブジェクトを真実のオブジェクトに置き換えて私たちの効果を達成し、元のクラス、元のオブジェクトに変化的な影響を与えることはありません.
    mock
    @Test
    public void testLogin() throws Exception {
    
        UserManager mockUserManager = Mockito.mock(UserManager.class);
        //      ,       mock UserManager  
    
        LoginPresenter loginPresenter = new LoginPresenter();
        loginPresenter.setUserManager(mockUserManager);
        //         loginPresenter ,          ,       
    
        loginPresenter.login("xiaochuang", "xiaochuang password");
        //                  
    
        Assert.assertTrue(Mockito.verify(mockUserManager, Mockito.times(1)).performLogin("xiaochuang", "xiaochuang password"));
        //    11   loginPresenter.login     ,   performLogin  1 ,      true
        //Mockito.verify(mockUserManager, Mockito.times(1))     Mockito.verify(mockUserManager)       
    
        Mockito.when(mockUserManager.verifyPassword("xiaochuang_is_handsome")).thenReturn(true);
        //   mockUserManager verifyPassword   ,    true
    }
    

    上のコードと注釈は基本的にmockitoの動作原理を説明していますが、mockが生成したオブジェクトのすべてのメソッドは実際に実行されず、int、longタイプのメソッドは0を返し、booleanメソッドはfalseを返し、オブジェクトメソッドはnullを返します.このオブジェクトをmockで生成(@mock注記が打たれる)するすべての方法が空になっている限り.一方、whenメソッドは、メソッドのいずれかに戻り結果を指定するだけです.
    spy
    すべての方法が空であることを望んでいない場合もありますが、自分で指定したい場合はspyメソッドを使用します.
    UserManager mockUserManager = Mockito.spy(UserManager.class);
    //          ,   when          
    

    @Mockと@InjectMocks
    mockitoを使用する考え方を整理します.
  • mockのオブジェクトaを作成します.このオブジェクトメソッドは
  • 空です.
  • 試験方法では、対象bの方法C、すなわちb.C
  • を試験する.
  • bオブジェクトの中でオブジェクトaを組み合わせて、私たちはmockのオブジェクトaをbに伝えて本当のaを置き換える必要があります.b.C実行の内部で、aの方法a.D、a.E実行に出会ったときに空の
  • になります.
    上記の3つのステップは、aとbを結合する必要があります.注釈を使用しないときはsetterでこの問題を解決し、注釈があれば、注釈を便利に使用することができます.
    @InjectMocks
    @Resource(name = "loginPresenter")
    LoginPresenter loginPresenter;
    
    @Mock
    UserManager mockUserManager;
    
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        //        Mocks   InjectMocks         
    }
    
    @Test
    public void testLogin() throws Exception {
    
        loginPresenter.login("xiaochuang", "xiaochuang password");
        //                  
        Assert.assertTrue();
    
    }
    

    上記のコードは私たちが始めたコードと全く同じ役割を果たしていますが、注釈を使用しているため、多くのことが明らかになりました.その中で、initMocks法は2つの注釈の組み立てを行いました.注記を使用すると、次の2つの点に注意する必要があります.
  • オブジェクトを組み立てる必要がある場合は、2つの@InjectMocks注記
  • を使用できない手動で構成する必要があるレイヤがあるに違いありません.
  • 一般的に私たちの方法はオブジェクトを返します.@Mock後、オブジェクトを返す方法はnullを返します.必要があれば、自分でwhen方法で戻り値
  • を設定します.