反モードの経典-Mockito設計解析
幸いなことに、私たちはこの問題に対応する方法があります: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, 。 “ ” 。 。