èšäºã«ã€ããŠ
ããã«Mockitoã®å¥ã®ã¬ã€ãããããŸãã ãã®äžæ¹ã§ãç§ã¯ãã®ã©ã€ãã©ãªã®æ©èœã説æããããšè©Šã¿ãŸããããã®ããããã®ã©ã€ãã©ãªã«äžæ
£ããªèªè
ã¯ãåã«äžè¬çãªèãã§ã¯ãªããããã«å®å
šã«äœ¿çšããæ©äŒãåŸãŸããã äžæ¹ãç§ã¯ãããååã«ã³ã³ãã¯ãã§æ§é åããããã«å
šäœãèªã¿ãäžåºŠèªãã ãã®ã®å¿ãããããã®ãããã«èŠã€ããããããã«ãããã£ãã äžè¬ã«ããã®èšäºã¯ãç§ããã®ã©ã€ãã©ãªã«åºäŒã£ãã°ããã§ããããã©ã®ããã«æ©èœããã®ããæ¬åœã«çè§£ããŠããªãã£ããšãã«ãç§ã«ãšã£ãŠã¯åœ¹ç«ã€ã§ãããã
ä»ã§ã¯åœ¹ã«ç«ã€ãããããŸãã-æã
ããã®ããã€ããå¿ããŠããŸããŸãããããŠãå
¬åŒã®ææžãä»ã®äººã®èšäºã§ã¯ãªããç§èªèº«ã«ãããšãäŸãã°æŠèŠãæãåºãã®ãæã䟿å©ã§ãã åæã«ãç§ã¯äž»ã«æåããMockitoãæ¢çŽ¢ããã®ã«äŸ¿å©ã«ãªãããã«ããã¹ããäœæããããšããŸããããŸããäžéšã®å Žæã§ã¯äžèŠæãããªããšã詳现ã«åæããŸããã
å
容ïŒ
- MockitoïŒããã¯äœã§ããããªããããå¿
èŠãªã®ã
- ç°å¢ãããŒãžã§ã³ãå®éšåç©
- ã¢ãã¯ãšã¹ãã€
- è¡å管ç
- é話æ¡ä»¶ãèšå®ãã
- éè©±çµæã®èšå®
- ã¡ãœããåŒã³åºãã®è¿œè·¡
- ãã£ãŒã«ãå€ããã³Mockitoã¢ãããŒã·ã§ã³ãšããŠã®ãªããžã§ã¯ãã®ã¢ãã¯
- ããã©ã«ãããã³Mockitoã»ãã·ã§ã³ãžã®ããŒã«ããã¯åäœ
- ä»ã«äœïŒ
MockitoïŒããã¯äœã§ããããªããããå¿
èŠãªã®ã
ã€ãŸããMockitoã¯ã¹ã¿ããã¬ãŒã ã¯ãŒã¯ã§ãã
ãåãã®ããã«ãã³ãŒãããã¹ããããšãïŒäž»ã«ãŠããããã¹ãã ãã§ãªããäž»ã«ãŠããããã¹ãïŒããã¹ãäžã®èŠçŽ ã¯ãäœæ¥æã«äœ¿çšããå¿
èŠãããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãæäŸããå¿
èŠããããŸãã ãã ããå€ãã®å Žåãå®å
šã«æ©èœããå¿
èŠã¯ãããŸãããéã«ãå³å¯ã«å®çŸ©ãããæ¹æ³ã§åäœããå¿
èŠããããããåäœã¯åçŽã§å®å
šã«äºæž¬å¯èœã§ãã ãããã¯ã¹ã¿ããšåŒã°ããŸãã ããããååŸããããã«ãã€ã³ã¿ãŒãã§ãŒã¹ã®ä»£æ¿ãã¹ãå®è£
ãäœæããæ©èœãåå®çŸ©ããŠå¿
èŠãªã¯ã©ã¹ãç¶æ¿ããããšãã§ããŸããããããã¯ãã¹ãŠéåžžã«äžäŸ¿ã§ãåé·ã§ããšã©ãŒããããããããŸãã ããããæå³ã§ãã䟿å©ãªãœãªã¥ãŒã·ã§ã³ã¯ãã¹ã¿ããäœæããããã®ç¹å¥ãªãã¬ãŒã ã¯ãŒã¯ã§ãã ãããã®1ã€ïŒãããŠããããJavaã§æãæåãªãã®ïŒã¯Mockitoã§ãã
Mockitoã䜿çšãããšã1è¡ã®ã³ãŒãã§ãã¯ã©ã¹ã®ããããã¢ãã¯ïŒç®çã®ã¹ã¿ãã®åºç€ã®ãããªãã®ïŒãäœæã§ããŸãã ãã®ãããªã¢ãã¯ã®å ŽåãäœæçŽåŸã®ç¹å®ã®ããã©ã«ãã®åäœã¯ç¹åŸŽçã§ãïŒãã¹ãŠã®ã¡ãœããã¯ä»¥åã«æ¢ç¥ã®å€ãè¿ããŸã-éåžžããã¯null
ãŸãã¯0
ïŒã ãã®åäœã¯ãå¿
èŠã«å¿ããŠåå®çŸ©ããããé©åãªè©³çŽ°åºŠã§å¶åŸ¡ãããã§ããŸãã ãã®çµæãã¢ãã¯ã¯å¿
èŠãªããããã£ãæã€ã¹ã¿ãã«ãªããŸãã 以äžã«ããããè¡ãæ¹æ³ã«ã€ããŠè©³ãã説æããŸãã
ãããã®ã¯ã©ã¹ã«å¯ŸããŠãã¢ãã¯ãäœæã§ããããšã«æ³šæããŠãã ãããç¹ã«ãæ°ããã€ã³ã¹ã¿ã³ã¹ã¯ãç¹ã«ã·ã³ã°ã«ãã³ã¯ã©ã¹ããŠãŒãã£ãªãã£ã¯ã©ã¹ãªã©ã®ãã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã¿ãåãããã¬ãŒã ã¯ãŒã¯ãšåæåã®æå°éã®æ§æã§ã¯ã©ã¹ãäœæããããšã¯ã§ããŸããã
ç°å¢ãããŒãžã§ã³ãå®éšåç©
ãã®èšäºãæžããšããç§ã¯äœ¿çšããŸããïŒ
- MockitoïŒ 'org.mockitoïŒmockito-coreïŒ2.24.0'ïŒå·çæç¹ã®ææ°ã®å®å®çïŒ
- TestNGïŒãã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠã®ãorg.testngïŒtestngïŒ6.14.3ã
- AssertJïŒæ€èšŒããŒã«ãšããŠã®ãorg.assertjïŒassertj-coreïŒ3.11.1ã
- LombokïŒ 'org.projectlombokïŒlombokïŒ1.18.6'ïŒäŸ¿å®äžïŒ
- Java 8
ç§ã®é人éçãªå®éšã®ããã«ãç¹å®ã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸãããµãŒãã¹ã€ã³ã¿ãŒãã§ã€ã¹ãããã«æžããŸããã
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ã§èå¥ãããããã€ãã®ç¹æ§ããããŸããããµãŒãã¹ã«ãã£ãŠè¿ããã圢åŒã§çŽæ¥ãæååã§ãããããè€éãªãªããžã§ã¯ãã§ã¯ãããŸããã éèŠãªããšãèŠéãããšã¯ãããŸãããäŸã¯ããã·ã³ãã«ã§æç¢ºã§ãã
ããã«æ³šæããŸããæ¬¡ã®äŸã§ã¯ãæç¢ºã«ããããã«ã¢ãã¯ãªããžã§ã¯ãã®ãªãŒããŒã©ã€ããããã¡ãœãããçŽæ¥åŒã³åºããŸãããå®éã®ãã¹ãã§ã¯ã¢ã€ãã¢ã¯ãŸã£ãããããŸããïŒ ãã®ãã¹ãã§ã¯ãäžè²«ããŠæ¬¡ã®ããšãè¡ããŸãã
- å¿
èŠã«å¿ããŠãµãŒãã¹ã®ã¢ãã¯ãæ§æããŸããã
- ïŒãããããã³ã³ã¹ãã©ã¯ã¿ãä»ããŠïŒããã䜿çšããå¥ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«æž¡ããŸãïŒ
DataService
ã«ãã£ãŠæäŸãããããŒã¿ã䜿çšããããçš®ã®ããžãã¹ããžãã¯ãå«ããšæ³å®ïŒããããå®éã«ãã¹ãããŸãã - ãã¹ããããã¯ã©ã¹ã®æ©èœãæå¹ã«ããçµæãå¶åŸ¡ããŸããã
- å¿
èŠã«å¿ããŠãåã®ã¢ã¯ã·ã§ã³ã®çµæãšããŠãã¹ããããã¯ã©ã¹ã«ãã£ãŠåŒã³åºãããã¯ãã®ãã¢ãã¯ã®ã¡ãœããã®åŒã³åºãã®æ°ãšé åºãå¶åŸ¡ããŸãã
ã¢ãã¯ãšã¹ãã€
ã»ãšãã©ã®æ©èœã«ã¢ã¯ã»ã¹ããããšã«ãªã£ãŠãã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);
ã¯ã©ã¹ã«åºã¥ããŠã¹ãã€ãäœæããå Žåããã®ã¿ã€ããã€ã³ã¿ãŒãã§ã€ã¹ã®å Žåãéåžžã®ã¢ãã¯ãªããžã§ã¯ããäœæãããã¿ã€ããã¯ã©ã¹ã®å Žåã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) {
åŒæ°ã«é¢ä¿ãªããã®ã¡ãœããã®åŒã³åºãã«å¿çãèšå®ããå¿
èŠãããå Žåã Mockito.any
ã¡ãœããã䜿çšããå¿
èŠããããŸãã
Mockito.when(dataService.getDataItemById(any())) .thenReturn("dataItem");
åŒæ°ã®ç¹å®ã®å€ã«ã®ã¿åå¿ããããã«ã¢ãã¯ãå¿
èŠãªå Žåã¯ããã®å€ãçŽæ¥äœ¿çšãããã Mockito.eq
ïŒåçã®å ŽåïŒãŸãã¯Mockito.same
ïŒãªã³ã¯æ¯èŒãå¿
èŠãªå ŽåïŒã®ã¡ãœããã䜿çšã§ããŸãã
Mockito.when(dataService.getDataItemById("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() {
, â , "" (, ) , .
ä»ã«äœïŒ
Mockito: mock spy-, . , . , , :
- Mockito mock-
MockSettings
( â , mock' - ); - mock-,
MockingDetails
; BDDMockito
Mockito
;- ( JUnit Mockito, ).
Mockito . javadoc' Mockito
.
, , .