反モードの経典-Mockito設計解析

7877 ワード

テストドライバの開発(Test Driven Design,TDD)では、まずユニットテストを書き、実装コードを書くように要求されています.ユニットテストを書く過程で、テストするクラスには多くの依存があり、これらの依存するクラス/オブジェクト/リソースには別の依存があり、それによって大きな依存ツリーが形成され、ユニットテストの環境でこのような依存を完全に構築することは困難である.
幸いなことに、私たちはこの問題に対応する方法があります:Mock.簡単に言えば、テストされたクラスに依存する他のクラスとオブジェクトに対してmockを行う-それらの偽オブジェクトを構築し、これらの偽オブジェクト上の動作を定義し、被テストオブジェクトに提供して使用する.テスト対象オブジェクトは、本物のオブジェクトを使用するように使用されます.このようにして、私たちはテストの目標を被テスト対象自身に限定することができて、被テスト対象の周囲で1つの切断をしたように、できるだけ小さい被テスト目標を形成しました.ユニットテストにおけるMockの役割について、Martin Fowlerは専門的に述べたことがある.http://martinfowler.com/articles/mocksArentStubs.html.

Mockitoのデザイン


Mockのフレームワークは多く、最も有名なのはMockitoで、これはオープンソースプロジェクトで、広く使われています.公式サイト:http://site.mockito.org/.例:

import org.mockito.Mockito;

//  mock 
List mockedList = Mockito.mock(List.class);

//  mock  -  get 0"one"
Mockito.when(mockedList.get(0)).thenReturn("one");

//  mock  -  "one", 
String str = mockedList.get(0);

Assert.assertTrue("one".equals(str));
Assert.assertTrue(mockedList.size() == 0);

//  mock get , 0
Mockito.verify(mockedList).get(0); 

: mock , mock get, get , 0 , ”one”; , ( mock get ); 。 , , , 。 , :


//  mock  -  get 0"one"
Mockito.when(mockedList.get(0)).thenReturn("one");

, : mockedList.get , 0 , ( object), when , when , thenReturn。 ?mockedList.get(0) , mockedList , when ? , 。 : mockedList get , 0 , ”one”。 , ? API , :


Mockito.returnValueWhen("one", mockedList, "get", 0);

, mock , mock , mock 。 , 。

, Mockito , , :

。 , , get fetch , ”get” ”fetch”, , , , 。 Mockito , , , 。

,Mockito ,Mockito 。

インプリメンテーション

Mockito , Mockito 。 ,Mock , Proxy 。Proxy , , proxy , , proxy , proxy , , , 。Proxy , , 。

Java Proxy API:Java Dynamic Proxy API。Mockito Java Dynamic Proxy API 。

, API。 , , Mock (proxy ), mock ( )。 , , proxy ,proxy , 。 stub , :


//  mock  -  get 0"one"
Mockito.when(mockedList.get(0)).thenReturn("one");

when , mockedList (get), (0), mockedList.get , 。 java 。 , , :


  //  mock  -  get 0"one"
  String str = mockedList.get(0);
  Mockito.when(str).thenReturn("one");

Java , Mockito 。 Mockito , , 。

, Mockito —— , 。 get ( proxy get ), (get), (0), thenReturn , ”one” , , stub , stub 。

?Mockito , 。 MockHandlerImpl.handle() 。 Mockito Github 。


public Object handle(Invocation invocation) throws Throwable {
     if (invocationContainerImpl.hasAnswersForStubbing()) {
         ...
    }
     ...
     InvocationMatcher invocationMatcher = matchersBinder.bindMatchers(
            mockingProgress.getArgumentMatcherStorage(),
           invocation
    );
   mockingProgress.validateState();
    // if verificationMode is not null then someone is doing verify()
   if (verificationMode != null) {
   ...
      }
    // prepare invocation for stubbing   invocationContainerImpl.setInvocationForPotentialStubbing(invocationMatcher);
  OngoingStubbingImpl<T> ongoingStubbing = 
  new OngoingStubbingImpl<T>(invocationContainerImpl);
mockingProgress.reportOngoingStubbing(ongoingStubbing);
   ...
}

1 , 6-9 , (invocation) invocationMatcher , 19-21 ,invocationMatcher ongoingStubbing 。 stub 。 thenReturn 。 。

, ,mockedList get proxy ( MockHandlerImpl.handle ), handle return , , stub , stub。

まとめ

,Mockito “ ”, , , , mock。 , Mockito 。 “ ” 。“ ” , , , , return , , “ ” 。 Mockito ,Mockito Mockito.anyString(), mockInstance.method(), Mockito.when(), thenReturn(), , “ ” —— , 。 Mockito , 。

, Mocking , “ ” 。 , API, , 。 , , 。 , , , , , 。 ,Mockito 。

  • Mockito - A Simple, Intuitive Mocking Framework
    https://dzone.com/refcardz/mockito
  • Mockito: drink it without moderation
    http://damienlepage.com/mockito-drink-it-without-moderation/
  • Mockito
    http://monkeyisland.pl/2008/01/14/mockito/
  • Explanation how proxy based Mock Frameworks work
    http://blog.rseiler.at/2014/06/explanation-how-proxy-based-mock.html
  • How does mockito when() invocation work?
    http://stackoverflow.com/questions/14440270/how-does-mockito-when-invocation-work/32321037#32321037
  • Explore the Dynamic Proxy API
    http://www.javaworld.com/article/2076233/java-se/explore-the-dynamic-proxy-api.html
  • Mockito for Spring https://www.geekbooks.me/book/view/mockito-for-spring
  • Mockto 2.0 doc
    http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#2

, , Java , IBM, 。 “ ” 。 。