モッキヌトず調理方法

蚘事に぀いお


ここにMockitoの別のガむドがありたす。 その䞀方で、私はこのラむブラリの機胜を説明しようず詊みたした。そのため、このラむブラリに䞍慣れな読者は、単に䞀般的な考えではなく、すぐに完党に䜿甚する機䌚を埗たした。 䞀方、私はそれを十分にコンパクトで構造化し、すぐに党䜓を読み、䞀床読んだものの忘れられたものをすぐに芋぀けられるようにしたかった。 䞀般に、この蚘事は、私がこのラむブラリに出䌚ったばかりで、それがどのように機胜するのかを本圓に理解しおいなかったずきに、私にずっおは圹立぀でしょう。


今では圹に立぀かもしれたせん-時々これのいく぀かを忘れおしたいたす。そしお、公匏の文曞や他の人の蚘事ではなく、私自身によるず、䟋えば抂芁を思い出すのが最も䟿利です。 同時に、私は䞻に最初からMockitoを探玢するのに䟿利になるようにテキストを䜜成しようずしたした。たた、䞀郚の堎所では䞀芋明らかなこずを詳现に分析したした。


内容


  1. Mockitoそれは䜕であり、なぜそれが必芁なのか
  2. 環境、バヌゞョン、実隓動物
  3. モックずスパむ
  4. 行動管理
    1. 通話条件を蚭定する
    2. 通話結果の蚭定
  5. メ゜ッド呌び出しの远跡
  6. フィヌルド倀およびMockitoアノテヌションずしおのオブゞェクトのモック
  7. デフォルトおよびMockitoセッションぞのロヌルバック動䜜
  8. 他に䜕

Mockitoそれは䜕であり、なぜそれが必芁なのか


぀たり、Mockitoはスタブフレヌムワヌクです。


ご存じのように、コヌドをテストするずき䞻にナニットテストだけでなく、䞻にナニットテスト、テスト䞭の芁玠は、䜜業時に䜿甚する必芁があるクラスのむンスタンスを提䟛する必芁がありたす。 ただし、倚くの堎合、完党に機胜する必芁はありたせん。逆に、厳密に定矩された方法で動䜜する必芁があるため、動䜜は単玔で完党に予枬可胜です。 それらはスタブず呌ばれたす。 それらを取埗するために、むンタヌフェヌスの代替テスト実装を䜜成し、機胜を再定矩しお必芁なクラスを継承するこずができたすが、これらはすべお非垞に䞍䟿で、冗長で、゚ラヌがたくさんありたす。 あらゆる意味でより䟿利な゜リュヌションは、スタブを䜜成するための特別なフレヌムワヌクです。 それらの1぀そしおおそらくJavaで最も有名なものはMockitoです。


Mockitoを䜿甚するず、1行のコヌドで、クラスのいわゆるモック目的のスタブの基瀎のようなものを䜜成できたす。 このようなモックの堎合、䜜成盎埌の特定のデフォルトの動䜜は特城的ですすべおのメ゜ッドは以前に既知の倀を返したす-通垞これはnullたたは0 。 この動䜜は、必芁に応じお再定矩したり、適切な詳现床で制埡したりできたす。 その結果、モックは必芁なプロパティを持぀スタブになりたす。 以䞋に、これを行う方法に぀いお詳しく説明したす。


これらのクラスに察しおもモックを䜜成できるこずに泚意しおください。特に、新しいむンスタンスは、特にシングルトンクラスやナヌティリティクラスなどのプラむベヌトコンストラクタヌのみを備え、フレヌムワヌクず列挙型の最小限の構成でクラスを䜜成するこずはできたせん。


環境、バヌゞョン、実隓動物


この蚘事を曞くずき、私は䜿甚したした



私の非人道的な実隓のために、特定のデヌタぞのアクセスを提䟛するサヌビスむンタヌフェむスをここに曞きたした。


 public interface DataService { void saveData(List<String> dataToSave); String getDataById(String id); String getDataById(String id, Supplier<String> calculateIfAbsent); List<String> getData(); List<String> getDataListByIds(List<String> idList); List<String> getDataByRequest(DataSearchRequest request); } 

そしお、最埌のむンタヌフェむスメ゜ッドに枡されるリク゚ストクラスのこのコヌド順序のためです。


 @AllArgsConstructor @Getter class DataSearchRequest { String id; Date updatedBefore; int length; } 

デヌタ単䜍はIDで識別され、いく぀かの特性がありたすが、サヌビスによっお返される圢匏で盎接、文字列であり、より耇雑なオブゞェクトではありたせん。 重芁なこずを芋逃すこずはありたせん。䟋はよりシンプルで明確です。


すぐに泚意したす。次の䟋では、明確にするためにモックオブゞェクトのオヌバヌラむドされたメ゜ッドを盎接呌び出したすが、実際のテストではアむデアはたったくありたせん このテストでは、䞀貫しお次のこずを行いたす。



モックずスパむ


ほずんどの機胜にアクセスするこずになっおいるMockitoの䞭心​​クラスは、実際にはMockitoず呌ばれるクラスMockito  BDDにより適した圢匏でほが同じ機胜を提䟛するBDDMockitoクラスもありたすが、ここでは詳しく説明したせん 。 機胜ぞのアクセスは、静的メ゜ッドを介しお実装されたす。


DataServiceクラスのモックを䜜成するには、次を実行するだけです。


 DataService dataServiceMock = Mockito.mock(DataService.class); 

完了-必芁なクラスのむンスタンスを取埗したした。 この型のパラメヌタヌを必芁ずするメ゜ッドたたはコンストラクタヌたずえば、テストするクラスのコンストラクタヌで受け入れられたす。 䞭毒チェックが埌でそれを埅っおいおも、それを枡したす instanceof DataServiceがtrueを返すだけでなく、 dataServiceMock.getClass() -぀たりDataService.classも返しtrue 。 䜕らかの正匏な方法で、モックオブゞェクトを通垞のモックオブゞェクトずプログラムで区別するこずは、かなり難しいタスクであるこずが刀明したす。これは論理的です。結局、最初のオブゞェクトは2番目のオブゞェクトず区別できたせん。 ただし、Mockitoにはこのためのツヌル、 Mockito.mockingDetailsメ゜ッドがありたす。 任意のオブゞェクトを枡すこずで、 MockingDetailsクラスのオブゞェクトを取埗したす。 Mockitoの芳点からこのオブゞェクトが䜕であるかに぀いおの情報が含たれおいたすモック、スパむ䞋蚘参照、䜿甚方法、䜜成方法など。


特に泚意すべきは、enumの最終クラスたたは暡擬むンスタンスのモックを䜜成しようずしたずき、たたはfinalメ゜ッドの動䜜をオヌバヌラむドしようずしたずきの状況です。 この堎合、Mockitoのデフォルトの動䜜では、䞊蚘のコヌドは正確にこの状況を匕甚しお動䜜を拒吊したす。 ただし、これは倉曎できたす-プロゞェクトにプロゞェクトディレクトリツリヌの暙準デバむスを䜿甚しおファむルtest/resources/mockito-extensions/org.mockito.plugins.MockMaker 、その䞭に次の行を入力したす。


 mock-maker-inline 

その埌、通垞の方法で最終クラスず列挙型を暡倣し、最終メ゜ッドをオヌバヌラむドできたす。


私が実際に埗たモックは、可胜な限り機胜がありたせん。単䞀のメ゜ッドが䜕かに圱響するこずはなく、戻り倀はオブゞェクト型ではnull 、プリミティブ型では0になりたす。 泚メ゜ッドがコレクションを返す堎合、デフォルトのモックはnullではなく、空のコレクションむンスタンスを返したす。 たずえば、 List 、実際のメ゜ッドが䜕を返すかLinkedList関係なくListこれは空のLinkedListになりたす。 しかし、配列、プリミティブ、たたはオブゞェクトの倀ずしお、私はnullを取埗しnull 。 MockSettingsクラスの機胜を䜿甚しお、デフォルトの動䜜だけでなくを倉曎できたすが、これはほずんど必芁ありたせん。


䜕らかの方法で、ほずんどの堎合、デフォルトの動䜜は必芁ありたせん。次のセクションでは、代わりに必芁なものを蚭定する方法を詳现に分析したす。


ただし、利甚可胜な機胜を備えた実際のクラスのオブゞェクトをスタブずしお䜿甚し、そのメ゜ッドの䞀郚のみの操䜜を再定矩する堎合はどうなりたすか 単䜓テストに぀いお話しおいる堎合、そのような必芁性は通垞垞にではありたせんが、プロゞェクトが蚭蚈に問題があるこずを瀺し、原則ずしおこれは掚奚されたせん。 ただし、䜕らかの理由でこれを回避できない堎合がありたす。 この堎合、Mockitoにはいわゆるスパむ「スパむ」がいたす。 モックずは異なり、クラスず完成したオブゞェクトの䞡方に基づいお䜜成できたす。


 DataService dataServiceSpy = Mockito.spy(DataService.class); // or DataService dataService = new DataService(); dataServiceSpy = Mockito.spy(dataService); 

クラスに基づいおスパむを䜜成する堎合、そのタむプがむンタヌフェむスの堎合、通垞のモックオブゞェクトが䜜成され、タむプがクラスの堎合、Mockitoはデフォルトコンストラクタヌパラメヌタヌなしを䜿甚しおむンスタンスを䜜成しようずしたす。 そしお、そのようなコンストラクタヌがない堎合にのみ、゚ラヌが発生し、テストは機胜したせん。


スパむオブゞェクトのデフォルトの動䜜は、通垞のクラスむンスタンスの動䜜ず同じですが、モックオブゞェクトず同じ可胜性がありたす。動䜜を再定矩しお䜿甚を監芖できたす次のセクションを参照。 重芁なポむントスパむは、それが䜜成されたむンスタンスのラッパヌではありたせん したがっお、spyメ゜ッドを呌び出しおも、元のむンスタンスの状態には圱響したせん。


行動管理


だから、私が必芁なこずをするためにモックやスパむを取埗する方法に぀いお。 さらに、私は垞にどこでも単に「モック」ず曞きたす-特に明蚘しない限り、これは「モックたたはスパむ」を意味したす。


䞀般に、モックオブゞェクトの動䜜を制埡するこずは、1぀の明癜な抂念に垰着したすモックがそのような方法で圱響を受けた堎合぀たり、そのようなメ゜ッドがそのような匕数で呌び出された堎合、そのような方法で応答する必芁がありたす。 このコンセプトには、Mockitoクラス内に2぀の実装がありたす。可胜な限り䜿甚するために開発者が掚奚するメむン実装ず、メむン実装が適切でない堎合に䜿甚される代替実装です。


䞻な実装は、 Mockito.whenメ゜ッドに基づいおいたす。 このメ゜ッドは、「パラメヌタヌ」ずしおモックオブゞェクトの再定矩されたメ゜ッドぞの呌び出しこのようにしお怜出されたアクションが修正されたすをOngoingStubbing 、 Mockito.then...ファミリヌのメ゜ッドの1぀を呌び出すこずができるOngoingStubbing型のオブゞェクトを返したすこれにより、この効果に察する反応が蚭定されたす。 すべおをたずめるず、最も単玔な堎合、次のようになりたす。


 List<String> data = new ArrayList<>(); data.add("dataItem"); Mockito.when(dataService.getAllData()).thenReturn(data); 

この操䜜の埌、 getAllData()オブゞェクトでgetAllData()メ゜ッドをdataService 、リストの最初の行で指定されたオブゞェクトを取埗したす。


ここでは、おなじみの「オブゞェクト指向」の盎芳が䜕らかの誀動䜜を䞎える可胜性があるため、これに぀いお詳しく説明する䟡倀がありたす。 Java構文の芳点からするず、パラメヌタヌずしおwhenメ゜ッドに枡される倀は、もちろん、オヌバヌラむドされたメ゜ッドによっお返される倀です。 モックの堎合、これは空の倀です;スパむの堎合、これは実際のオブゞェクトのメ゜ッドによっお返される倀です。 しかし、Mockitoの「フヌドの䞋」で動䜜する魔法のおかげで、 whenメ゜ッドは、mock-objectメ゜ッドの呌び出しがwhen埌whenかっこ内にあるwhenのみ正垞に動䜜したす゚ラヌで起動しおもクラッシュしたせん。


このようなむデオロギヌは、Mockitoでモックの動䜜を定矩するずきによく機胜したす。モックオブゞェクトたたはMockitoクラスのメ゜ッドを呌び出すこずにより、返される倀を取埗しようずはしたせんが、䜕らかの方法で䜿甚するモックオブゞェクトのメ゜ッドの呌び出しに圱響を䞎えたすその境界、結果の蚭定、課題の芳察などを確立したす。 少し霧がかかっおいるように聞こえたすが、最初の衝突では奇劙に芋えたすが、それを理解するず、すぐにこのアプロヌチがスタブを扱うずいう文脈で完党に自然であるず感じるようになりたす。


条件ず呌び出しの結果をリンクする別の実装は、 Mockito.do...ファミリヌのMockito.do... 。 これらのメ゜ッドを䜿甚するず、呌び出しの結果から始たる動䜜を蚭定し、 Stubberクラスのオブゞェクトを返すこずができたす。これにより、すでに条件を蚭定できたす。 この方法で行われた䞊蚘ず同じバむンディングは、次のようになりたす。


 List<String> data = new ArrayList<>(); data.add("dataItem"); Mockito.doReturn(data).when(dataService).getData() 

違いは䜕ですか、なぜMockito.whenを介しおバむンドするMockito.whenが望たしいず考えられ、ただMockito.do...のメ゜ッドを䜿甚するMockito.do...か 泚最初の実装では、メ゜ッドの動䜜この堎合はgetAllData() を蚭定するずきに、ただ再定矩されおいないバヌゞョンぞの呌び出しが最初に実行され、その埌のみMockitoの腞内でオヌバヌラむドが発生したす。 2番目のケヌスでは、このような呌び出しは発生したせん。 Stubber.whenメ゜ッドStubber.whenメ゜ッドに盎接枡され、このメ゜ッドによっお返されたメ゜ッドから同じタむプの異なる性質のオブゞェクトが返されたす。 この違いがすべおを決定したす。 Mockito.do...を介したバむンドは、コンパむル段階で、再定矩可胜なメ゜ッドを呌び出したり、指定された戻り倀ず型の互換性があるかどうかをたったく制埡したせん。 したがっお、通垞はMockito.when -これに間違いはありたせん。 しかし、オヌバヌラむドされたメ゜ッドの呌び出しを避けたい堎合がありたす-新しく䜜成されたモックでは、そのような呌び出しはかなり受け入れられたすが、すでにこのメ゜ッドを再定矩したり、スパむに察凊しおいる堎合、それは望たしくない可胜性があり、䟋倖をスロヌしおも必芁な再定矩は蚱可されたせん。 そしお、ここでMockito.do...を介したリンクがMockito.do...になりMockito.do...


Mockito.do...メ゜ッドなしではできない別の状況は、 void返すメ゜ッドをオヌバヌラむドするこずです。保留䞭のMockito.whenパラメヌタヌは、そのようなメ゜ッドでは機胜したせん。 Mockito.doReturnここではMockito.doAnswerしおいたせんが、 Mockito.doThrow 、 Mockito.doAnswer 、およびめったに十分ではMockito.doNothingたす。


次に、呌び出しの条件ず結果を蚭定する方法に぀いおもう少し詳しく怜蚎したす。 Mockito.whenを介したバむンディングのみを怜蚎したす。代替方法は、凊理がほが完党に類䌌しおいたす。


通話条件を蚭定する


䞊蚘の䟋は、パラメヌタヌのないメ゜ッドに関するものであり、関連する呌び出し条件は、呌び出しの事実ずいう1぀の可胜性がありたす。 パラメヌタヌが衚瀺されるずすぐに、状況はより耇雑になりたす。 少なくずも、動䜜を蚭定しおいるメ゜ッドを呌び出すには、䜕かを枡す必芁がありたす。 しかし、もう1぀重芁なこずがありたす。特定の芁件を満たすパラメヌタヌを䜿甚しお呌び出した堎合にのみ、特定の反応が埗られるずは限りたせん。 DataServiceは次のメ゜ッドがありたす。


 String getDataItemById(String id) { // some code... } 

匕数に関係なくこのメ゜ッドの呌び出しに応答を蚭定する必芁がある堎合、 Mockito.anyメ゜ッドを䜿甚する必芁がありたす。


 Mockito.when(dataService.getDataItemById(any())) .thenReturn("dataItem"); 

匕数の特定の倀にのみ反応するためにモックが必芁な堎合は、この倀を盎接䜿甚するか、 Mockito.eq 同等の堎合たたはMockito.same リンク比范が必芁な堎合のメ゜ッドを䜿甚できたす。


 Mockito.when(dataService.getDataItemById("idValue")) .thenReturn("dataItem"); // or Mockito.when(dataService.getDataItemById(Mockito.eq("idValue"))) .thenReturn("dataItem"); 

匕数がいく぀かの芁件を満たすようにしたい堎合、同じMockitoクラスの䟿利な特殊な静的メ゜ッドがいく぀かありたすたずえば、文字列は、特定の文字シヌケンスの先頭たたは末尟、パタヌンマッチングなどでコンテンツをチェックできたす。 ArgumentMatcher機胜むンタヌフェむスの実装を受け入れる䞀般的なMockito.argThatメ゜ッドおよびプリミティブ型の類䌌物もありたす。


 Mockito.when(dataService.getDataById( Mockito.argThat(arg -> arg == null || arg.length() > 5))) .thenReturn("dataItem"); 

ArgumentMatchersクラスずAdditionalMatchersクラスを䜿甚するず、このむンタヌフェむスの䟿利な垂販の実装を䜿甚できたす。 たずえば、 AdditionalMatchers.orずAdditionalMatchers.and䜿甚するず、他のマッチャヌを組み合わせるこずができたす泚これらのクラスの静的メ゜ッドはマッチャヌのむンスタンスを返さず、アクセスするだけです


同じメ゜ッドの堎合、匕数の芁件が異なる動䜜を耇数回蚭定でき、この方法で定矩されたすべおの動䜜モデルが同時に機胜したす。 もちろん、堎合によっおは亀差するこずがありたす。たずえば、パラメヌタヌのint倀が5未満の堎合は1぀の結果を返し、偶数倀を受け取った堎合はもう1぀の結果を返すように芁求したす。 この状況では、埌で指定される動䜜が優先されたす。 したがっお、耇雑な動䜜パタヌンを定矩するずきは、最も匱い芁件制限内-any any() から始めおから、より具䜓的な芁件に進む必芁がありたす。


耇数の匕数を持぀メ゜ッドを䜿甚する堎合、指定された芁件は論理ANDに埓っお結合されたす。぀たり、指定された結果を取埗するには、すべおの匕数が指定された芁件を満たす必芁がありたす。 それらを組み合わせるための任意の方法を蚭定する方法は芋぀かりたせんでしたが、おそらく存圚したす。


さらに、このようなメ゜ッドの動䜜を指定する堎合、 Mockitoず倀の盎接転送をMockitoの静的メ゜ッドを組み合わせるこずはできたせん。 Mockito.eqたたはMockito.same䜿甚したす。


通話結果の蚭定


モックオブゞェクトメ゜ッドが呌び出された埌、オブゞェクトは呌び出しに応答する必芁がありたす。 考えられる䞻な結果は、結果を返し、䟋倖をスロヌするこずです。Mockitoツヌルキットが䞻に蚭蚈されおいるのは、これらのオプションに正確に基づいおいたす。


すでに䞊に瀺した最も単玔なケヌスでは、呌び出しに察する応答は倀を返すこずです。 もう䞀床圌のコヌドをあげたす。


 List<String> data = new ArrayList<>(); data.add("dataItem"); Mockito.when(dataService.getAllData()).thenReturn(data); 

泚オブゞェクトを返すこずしかできず、プリミティブ甚の個別のメ゜ッドはありたせん。 したがっお、メ゜ッドがプリミティブ倀を返す堎合、そのような状況ではun / boxingが発生したす。 ほずんどの堎合、これは干枉したせんが、コンパむラがそうでないず考える堎合は、䜕らかの圢で圌に同意する必芁がありたす...たたは圌の譊告に我慢しなければなりたせん。


䟋倖を投げるこずは難しくありたせん


 Mockito.when(dataService.getDataById("invalidId")) .thenThrow(new IllegalArgumentException()); 

別の方法がありたす䟋倖オブゞェクトを䜜成しお盎接スロヌするか、䟋倖クラスのみをMockitoに提䟛しお自動的に䜜成するこずができたす


 Mockito.when(dataService.getDataById("invalidId")) .thenThrow(IllegalArgumentException.class); 

どちらの堎合でも、構文では䟋倖を䜿甚しお確認できたすが、Mockitoでは、䟋倖の皮類がこの䟋倖をスロヌする方法ず䞀臎しない堎合、そのようなテストを実行できたせん。


クラスをパラメヌタヌずしお䜿甚する堎合、コンストラクタヌパラメヌタヌなしでもずフィヌルドの盎接初期化は無芖されたす-オブゞェクトはそれらをバむパスしお䜜成されるため結局、これはMockitoです、スロヌされる䟋倖のすべおのフィヌルドはnullになりnull 。 したがっお、䟋倖の内容が重芁な堎合たずえば、デフォルト倀を持぀typeフィヌルドなど、このメ゜ッドを攟棄しお手動で䟋倖を䜜成する必芁がありたす。


これらの反応オプションは、特定の条件での呌び出しに応じお、垞に特定の結果の同じ倀を返す必芁がある堎合、たたは垞に同じ䟋倖をスロヌする必芁がある堎合に適しおいたす。ほずんどの堎合、これらの機胜で十分です。 しかし、さらなる柔軟性が必芁な堎合はどうでしょうか メ゜ッドが倀のコレクションを受け入れ、最初の1察1に関連付けられた倀の別のコレクションを返したずえば、IDのセットによっおデヌタオブゞェクトのコレクションを取埗する、テストで異なる入力のセットでこのモックオブゞェクトを繰り返し䜿甚するずしたすデヌタ、察応する結果を毎回取埗したす。 もちろん、特定のパラメヌタヌセットそれぞれに察する反応を個別に蚘述するこずもできたすが、 Mockito.thenAnswerメ゜ッド別名Mockito.thenずいうより䟿利な゜リュヌションがありたす。 Answer関数むンタヌフェむスの実装を受け入れ、その唯䞀のメ゜ッドはInvocationOnMockクラスのオブゞェクトを受け取りたす。 埌者からは、メ゜ッド呌び出しのパラメヌタヌ番号ごずに、たたは配列の圢で䞀床にを芁求し、必芁に応じおそれらを操䜜できたす。 たずえば、私のコレクションの各芁玠の倀に察応する倀を取埗し、それらから新しいコレクションを䜜成しお返すこずができたす泚期埅どおりの結果はパラメヌタヌオブゞェクトの䞀郚のフィヌルドには曞き蟌たれず、単に返されたす。


 Mockito.when(dataService.getDataByIds(Mockito.any())) .thenAnswer(invocation -> invocation .<List<String>>getArgument(0).stream() .map(id -> { switch (id) { case "a": return "dataItemA"; case "b": return "dataItemB"; default: return null; } }) .collect(Collectors.toList())); 

むデオロギヌ的に、これは実際のメ゜ッドのモデルを曞くようなものですパラメヌタを取埗し、凊理し、結果を返したす。 - , - , , , mock- .


Answer , , — , AnswersWithDelay , ReturnsElementsOf . .


: InvocationOnMock — Object[] , generic-.


— thenCallRealMethod . . mock-, spy-. mock , , - null . spy thenCallRealMethod spy ; , - .


thenAnswer : InvocationOnMock callRealMethod() — , "" - .


OngoingStubbing OngoingStubbing , , , . , . thenReturn thenThrow , varargs. .


 Mockito.when(dataService.getDataById("a")) .thenReturn("valueA1", "valueA2") .thenThrow(IllegalArgumentException.class); 

"valueA1 , — "valueA2 ( ), ( ) IllegalArgumentException .



: (mock' ), . , : , , . verify .


, , :


 Mockito.verify(dataService).getDataById(Mockito.any()); 

, getDataById , , . , Mockito, when , , , mock-. , , , when , — mock', (. ).


:


 Mockito.verify(dataService, Mockito.times(1)) .getDataById(Mockito.any()); 

Mockito.times ; Mockito.never . Mockito.atLeast ( Mockito.atLeastOnce 1) Mockito.atMost , , Mockito.only , , mock- (. . ).


, Mockito , VerificationAfterDelay VerificationWithTimeout , Mockito.after Mockito.timeout . 䟋


 Mockito.verify(dataService, Mockito.after(1000).times(1)) .getDataById(Mockito.any()); 

, mock , , , . . after timeout , , , — , . , timeout — . VerificationWithTimeout never atMost : .


, Mockito.any() . , , — Mockito , , . Mock- , , , , :


 dataService.getDataById("a"); dataService.getDataById("b"); Mockito.verify(dataService, Mockito.times(2)).getDataById(Mockito.any()); Mockito.verify(dataService, Mockito.times(1)).getDataById("a"); Mockito.verify(dataService, Mockito.never()).getDataById("c"); dataService.getDataById("c"); Mockito.verify(dataService, Mockito.times(1)).getDataById("c"); Mockito.verifyNoMoreInteractions(dataService); 

verifyNoMoreInteractions ( verifyZeroInteractions ) — - ( verify ) mock- — . : varargs, , , !


, , , . , InOrder :


 InOrder inOrder = Mockito.inOrder(dataService); 

varargs; — mock- , InOrder . verify , Mockito.verify :


 inOrder.verify(dataService, times(2)).saveData(any()); inOrder.verify(dataService).getData(); 

, saveData , — getData . , InOrder , — .


, , — , . - , , — , , . ArgumentCaptor capture() . 䟋


 DataSearchRequest request = new DataSearchRequest("idValue", new Date(System.currentTimeMillis()), 50); dataService.getDataByRequest(request); ArgumentCaptor<DataSearchRequest> requestCaptor = ArgumentCaptor.forClass(DataSearchRequest.class); Mockito.verify(dataService, times(1)).getDataByRequest(requestCaptor.capture()); assertThat(requestCaptor.getAllValues()).hasSize(1); DataSearchRequest capturedArgument = requestCaptor.getValue(); assertThat(capturedArgument.getId()).isNotNull(); assertThat(capturedArgument.getId()).isEqualTo("idValue"); assertThat(capturedArgument.getUpdatedBefore()).isAfterYear(1970); assertThat(capturedArgument.getLength()).isBetween(0, 100); 

ArgumentCaptor , , ArgumentCaptor . getValue() , getAllValues() — . , , .


Mock- Mockito


, mock- , — @Mock - :


 MockitoAnnotations.initMocks(this); 

( , mock', )


spy @Spy — @Mock 
 spy , , ? , — spy .


@Captor ArgumentCaptor — , , .


@InjectMocks . - Mockito, . mock- , . , . - , null , - . ( ) dependency injection.


Mockito


, : mock (spy, argument captor...), , , . , mock' — , . JUnit , , TestNG — . , , mock' , , , . . , , — , .


, mock- . TestNG @BeforeMethod ( @AfterMethod ). mock' , , ( JUnit — @Before ).


, , — Mockito.reset Mockito.clearInvocations . varargs, mock'. , . : (, ) , / mock' , — . , mock' . . , , .


(, ) — MockitoAnnotations.initMocks(this); 。 "" , Mockito.


— Mockito. . mock- , ( mock' ). , MockitoSession , . TestNG:


 @Mock DataService dataService; MockitoSession session; @BeforeMethod public void beforeMethod() { session = Mockito.mockitoSession() .initMocks(this) .startMocking(); } @Test public void testMethod() { // some code using the dataService field } @AfterMethod public void afterMethod() { session.finishMocking(); } 

, — , "" (, ) , .


他に䜕


Mockito: mock spy-, . , . , , :



Mockito . javadoc' Mockito .


, , .



Source: https://habr.com/ru/post/J444982/


All Articles