åŠå®ããæçœªå€æ±ºãžã®éã®ãã¹ãŠã®èããããšãªãæ§ããããŸã...
éçºè ã®éã§ã¯ãããã°ã©ããŒãã³ãŒãããã¹ãã§ã«ããŒããªããšããªãããããå¿ èŠãªã®ãããããŠããããã©ã®ããã«æºåããã®ããçè§£ã§ããªããšããå ¬æ£ãªæèŠããããŸãããããäœã§ãããããã§ã«çè§£ããŠãããšããããã«ç°è°ãå±ããã®ã¯é£ããã§ãããããããã®è²Žéãªçè§£ãã©ã®ããã«éæã§ããã§ããããã
ããã¯æå³ãããŠããŸãã...
ã°ããŒãã«ãããã¯ãŒã¯äžã®èšå€§ãªæ°ã®æçšãªæ å ±ã®äžã§ãæãæçœãªããšãæç¢ºã«èª¬æãããŠããªãããšããããããŸããããçš®ã®åžžé£ã®ç³è«è ã¯ãããŠããããã¹ããšã¯äœãããšããç·æ¥ã®è³ªåã«å¯ŸåŠããããšã決å®ãããã¬ãŒã¹ããŒããŒã®ããã«èšäºããèšäºãžãšã³ããŒããããã®ãããªäŸã®å€ãã«åºããããŸãã
ãæ°å€ã®åèšãèšç®ããã¡ãœããããããŸãã
publicInteger sumïŒInteger aãInteger bïŒ{
return a + b
}
ããã®ã¡ãœããã®ãã¹ããèšè¿°ã§ããŸãã
ãã¹ã
public void testGoodOneïŒïŒ{
assertThatïŒsumïŒ2,2ïŒãisïŒ4ïŒïŒ;
}
ããã¯åè«ã§ã¯ãããŸãããããã¯ãŠããããã¹ãæè¡ã«é¢ããå žåçãªèšäºã®ç°¡ç¥åãããäŸã§ããæåãšæåŸã«å©ç¹ãšå¿ èŠæ§ã«ã€ããŠã®äžè¬çãªãã¬ãŒãºããããéäžã§...
ãããèŠãŠãä¿¡ä»°ã®ããã«2åèªã¿çŽããšãç³è«è ã¯æ¬¡ã®ããã«å«ã³ãŸãã ïŒ.. "çµå±ã®ãšããã圌ã®ã³ãŒãã«ã¯ãåŒæ°ãéããŠå¿ èŠãªãã¹ãŠãåãåãããããã«æç¢ºãªçµæãäžããã¡ãœããã¯äºå®äžãããŸããããããã¯å žåçãªå®çšçãªæ¹æ³ã§ãããã»ãšãã©å€ãããŸãããããããè€éãªããã·ãŒãžã£ãæ¿å ¥ãããäŸåé¢ä¿ãããã³å€ãè¿ããªãã¡ãœããã«ã€ããŠã¯ã©ãã§ãããããããã§ã¯ããã®ã¢ãããŒãã¯ããŸã£ããããšããèšèããã¯é©çšã§ããŸããã
ãã®æ®µéã§é åºãªç³è«è ãæãæ¯ããã«ããã«é£ã³èŸŒãã å Žåã圌ã¯ããã«MOCãäŸåé¢ä¿ã«äœ¿çšãããŠããããšãçºèŠããŸãããã®ã¡ãœããã«ã¯ãæ¡ä»¶ä»ãã®åäœãå®çŸ©ãããŠããŸããå®éã«ã¯ã¹ã¿ãã§ããããã§ã¯ãè¿ãã«ãã¹ãŠã説æããæºåãã§ããŠå¿è匷ãäžé«å¹Žãããªããã°ãç³è«è ã¯å®å šã«é ãæ©ãŸããããšãã§ããŸã...ããã§ãªããã°ããã¹ããããæ¹æ³ã®ã»ãšãã©ãäœããã®ã¢ãã¯ãã£ã¯ã·ã§ã³ã§ããããšã倿ãããããçå®ã®ç³è«è ã¯ããŠããããã¹ããšã¯äœããã®æå³ãå®å šã«å€±ããŸãããã®å Žåã«äœããã¹ããããŠãããã¯æç¢ºã§ã¯ãããŸãããããã«ããããå€§èŠæš¡ãªå€å±€ã¢ããªã±ãŒã·ã§ã³çšã«ç·šæããæ¹æ³ãšããããå¿ èŠãªçç±ã¯æç¢ºã§ã¯ãããŸããããããã£ãŠãããããã質åã¯ããè¯ãææãŸã§å»¶æãããææªã®å Žåãããã¯ã²ã©ããã®ã®ç®±ã®äžã«é ããŸãã
æãåä»ãªã®ã¯ããã¹ãã«ãã¬ããžãã¯ãããžãŒãåºæ¬çã«ã·ã³ãã«ã§èª°ããã¢ã¯ã»ã¹ã§ããããšã§ãããã®å©ç¹ã¯éåžžã«æçœã§ãããããç¥èã®ãã人ã«ãšã£ãŠã¯èšãèš³ãçŽ æŽã«èŠããŸãããããããããçè§£ããããã«ãåå¿è ã¯ã¹ã€ããã®ããªããã®ãããªããã€ãã®éåžžã«å°ããªãåºæ¬çãªæ¬è³ªãæ¬ ããŠããŸãã
äž»ãªäœ¿åœ
ãŸãããŠããããã¹ãã®ããŒæ©èœïŒããã·ã§ã³ïŒãšããŒã²ã€ã³ãäžèšã§è¡šãããšãææ¡ããŸããããã«ã¯ããŸããŸãªçŸãããªãã·ã§ã³ããããŸããããããæ€èšããããšãææ¡ã
ãŸãããŠããããã¹ã ã® éèŠãªæ©èœã¯ãã·ã¹ãã ã®äºæ³ãããåäœãèšé²ããããšã§ãã
ããã¯ããŠããããã¹ãã®
äž»ãªå©ç¹ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®æ©èœãæ°ç§ã§ãå®è¡ãã§ããããšã§ãã
ã€ã³ã¿ãã¥ãŒã®ããã«ãããèŠããŠããããšããå§ãããŸããå°ã説æããŸãããã¹ãŠã®æ©èœã¯ã䜿çšèŠåãšçµæãæå³ããŸãããããã®èŠä»¶ã¯ãã·ã¹ãã åæãéããŠããžãã¹ããããããããã³ãŒãã§å®è£ ãããŸããããããã³ãŒãã¯çµ¶ããé²åããŠãããæ°ããèŠä»¶ãšæ¹åãè¡ããã宿ããæ©èœã®äœãããã€ã®éã«ãäºæãã倿Žãããå¯èœæ§ããããŸããããã¯ããŠããããã¹ããã¬ãŒããç«ãŠãå Žæã§ãããã·ã¹ãã ãæ©èœããããã®æ¿èªãããã«ãŒã«ãä¿®æ£ããŸãããã¹ãã¯ããžãã¹ã«ãšã£ãŠéèŠãªã·ããªãªãèšé²ããæ¬¡ã®æ¹èšåŸã«ãã¹ãã倱æããå Žåãäœããæ¬ ããŠããŸããéçºè ãŸãã¯ã¢ããªã¹ãã®ãããããééã£ãŠããããæ°ããèŠä»¶ãæ¢åã®èŠä»¶ãšççŸããŠãããããæç¢ºã«ããå¿ èŠããããŸããæãéèŠãªããšã¯ããé©ãããããæããªãã£ãããšã§ãã
ã·ã³ãã«ãªæšæºãŠããããã¹ãã«ãããäºæããªããããããæãŸãããªãã·ã¹ãã åäœãæ©æã«æ€åºããããšãã§ããŸããããã®éãã·ã¹ãã ã¯æé·ããæ¡åŒµãããã®è©³çްãèŠéãå¯èœæ§ãé«ãŸãããŠããããã¹ãã¹ã¯ãªããã ãããã¹ãŠãèšæ¶ããæéå ã®ç¥èŠã§ããªãéžè±ãé²ãããšãã§ããŸããããã¯éåžžã«äŸ¿å©ã§ä¿¡é Œæ§ãé«ããäž»ãªäŸ¿å©ãã¯ã¹ããŒãã§ããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠãäœçŸãã®ãã£ãŒã«ãããã©ãŒã ããŸãã¯ãã¿ã³ãããŸãã£ãŠããå¿ èŠã¯ãããŸããããã¹ããå®è¡ããŠãå®å šãªæºåãŸãã¯ãã°ãæ°ç§ã§ååŸããå¿ èŠããããŸãã
ãããã£ãŠãèŠããŠãããŸãããããŠããããã¹ãã¹ã¯ãªããã®åœ¢åŒã§äºæ³ãããåäœãä¿®æ£ããã¢ããªã±ãŒã·ã§ã³ãèµ·åããã«å³åº§ã«ãå®è¡ãããŸããããã¯ããŠããããã¹ãã§éæã§ãã絶察å€ã§ãã
ãããããããŒãã©ããã£ãŠïŒ
楜ããéšåã«ç§»ããŸããããçŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã¯ç©æ¥µçã«ã¢ããªã·ãã¯æ§ãåãé€ãã€ã€ãããŸãããã€ã¯ããµãŒãã¹ãã¢ãžã¥ãŒã«ããã¬ã€ã€ãŒã-äœæ¥ã³ãŒããæŽçããåºæ¬ååãããã«ãããç¬ç«æ§ãåå©çšã®å®¹æããã·ã¹ãã ãžã®äº€æãšè»¢éãªã©ãå®çŸã§ããŸãããã®ãããã¯ã§ã¯ãéå±€åãšäŸåé¢ä¿ã®æ³šå ¥ãéèŠã§ãã
å žåçãªWebã¢ããªã±ãŒã·ã§ã³ã®ã¬ã€ã€ãŒïŒã³ã³ãããŒã©ãŒããµãŒãã¹ããªããžããªãªã©ïŒã«ã€ããŠèããŠã¿ãŸããããã«ããŠãŒãã£ãªãã£ããã¡ãµãŒããã¢ãã«ãããã³DTOã¬ã€ã€ãŒã䜿çšãããŸããæåŸã®2ã€ã«ã¯ãæ©èœãå«ããã¹ãã§ã¯ãããŸãããã¢ã¯ã»ãµãŒïŒã²ãã¿ãŒ/ã»ãã¿ãŒïŒä»¥å€ã®ã¡ãœãããªã®ã§ããã¹ãã§ã«ããŒããå¿ èŠã¯ãããŸãããæ®ãã®ã¬ã€ã€ãŒãã«ãã¬ããžã®ã¿ãŒã²ãããšèŠãªããŸãã
ãã®æ¯èŒãã©ãã»ã©ãããããã瀺åããŠããŠããäŸåé¢ä¿ã®ããã«ããããã®ã¬ã€ã€ãŒãäºãã«åã蟌ãŸããŠãããããã¢ããªã±ãŒã·ã§ã³ãããã±ãŒããšæ¯èŒããããšã¯ã§ããŸããã
- ã³ã³ãããŒã©ã¯ãçµæãèŠæ±ãããµãŒãã¹ãå®è£ ããŸã
- ãµãŒãã¹ã¯ããèªäœã«ãªããžããªïŒDAOïŒãæ¿å ¥ãããŠãŒãã£ãªãã£ã³ã³ããŒãã³ããæ¿å ¥ã§ããŸã
- ãã¡ãµãŒãã¯ãããããå€ãã®ãµãŒãã¹ãŸãã¯ã³ã³ããŒãã³ãã®äœæ¥ãçµã¿åãããããã«èšèšãããŠãããããããå®è£ ããŸã
ã¢ããªã±ãŒã·ã§ã³å šäœã§ããããã¹ãŠããã¹ãããäž»ãªã¢ã€ãã¢ïŒä»ã®ã¬ã€ã€ãŒãšã¯ç¬ç«ããŠåã¬ã€ã€ãŒãã«ããŒããŸããç¬ç«æ§ããã³ãã®ä»ã®åã¢ããªã·ãã¯æ©èœãžã®åç §ããããããã¹ãããããµãŒãã¹ã«ãªããžããªãåã蟌ãŸããŠããå Žåããã®ãã²ã¹ããã¯ãµãŒãã¹ã®ãã¹ãã®äžéšãšããŠã¢ãã¯ãããŸããããªããžããªãã¹ãã®äžéšãšããŠãã§ã«æ£çŽã«å人çã«ãã¹ããããŠããŸãããããã£ãŠããã¹ãã¯åã¬ã€ã€ãŒã®èŠçŽ ããšã«äœæããã誰ããå¿ããããããšã¯ãããŸããããã¹ãŠãããžãã¹ã«ãããŸãã
ãããã¹ããªãŒã®åå
äŸãJava Spring Bootã®åçŽãªã¢ããªã±ãŒã·ã§ã³ã«ç§»ããŸããããã³ãŒãã¯åºæ¬çãªãã®ã«ãªããããæ¬è³ªã¯çè§£ãããããä»ã®ææ°ã®èšèª/ãã¬ãŒã ã¯ãŒã¯ã«ãåæ§ã«é©çšã§ããŸããã¢ããªã±ãŒã·ã§ã³ã«ã¯ç°¡åãªã¿ã¹ã¯ããããŸã-æ°å€ã«3ãæããŸããããªãã«ã§ãããåæã«ãäŸåé¢ä¿ã®æ³šå ¥ãšé ããã€ãŸå ãŸã§ã®ã¬ã€ã€ãŒãã«ãã¬ããžãåãããã«ãã¬ã€ã€ãŒã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
ãã®æ§é ã«ã¯ãã³ã³ãããŒã©ãŒããµãŒãã¹ããªããžããªã®3ã€ã®ã¬ã€ã€ãŒã®ããã±ãŒãžãå«ãŸããŠããŸãããã¹ãã®æ§é ã¯äŒŒãŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«æ©èœããŸãã
- ããã³ããšã³ãããã3åã«ããå¿ èŠã®ããçªå·ã®èå¥åã䜿çšããŠGETèŠæ±ãã³ã³ãããŒã©ãŒã«éä¿¡ãããŸãã
- ã³ã³ãããŒã©ã¯ããµãŒãã¹ã®äŸåé¢ä¿ããçµæãèŠæ±ããŸã
- ãµãŒãã¹ã¯äŸåé¢ä¿ïŒãªããžããªïŒããããŒã¿ãèŠæ±ããä¹ç®ããŠçµæãã³ã³ãããŒã©ã«è¿ããŸã
- ã³ã³ãããŒã©ã¯çµæãè£å®ããããã³ããšã³ãã«æ»ããŸã
ã³ã³ãããŒã©ããå§ããŸãããïŒ
@RestController
@RequiredArgsConstructor
public class SomeController {
private final SomeService someService; // dependency injection
static final String RESP_PREFIX = ": ";
static final String PATH_GET_TRIPLE = "/triple/{numberId}";
@GetMapping(path = PATH_GET_TRIPLE) // mapping method to GET with url=path
public ResponseEntity<String> triple(@PathVariable(name = "numberId") int numberId) {
int res = someService.tripleMethod(numberId); // dependency call
String resp = RESP_PREFIX + res; // own logic
return ResponseEntity.ok().body(resp);
}
}
å žåçãªã¬ã¹ãã³ã³ãããŒã©ãŒã«ã¯ãäŸåé¢ä¿ã®æ³šå ¥someServiceããããŸããããªãã«ã¡ãœããã¯ãURL "/ triple / {numberId}"ãžã®ãªã¯ãšã¹ããGETããããã«æ§æãããŠããŸããããã§ãçªå·èå¥åã¯ãã¹å€æ°ã§æž¡ãããŸããã¡ãœããèªäœã¯ã2ã€ã®äž»èŠãªã³ã³ããŒãã³ãã«åããããšãã§ããŸãã
- äŸåé¢ä¿ãžã®ã¢ã¯ã»ã¹-å€éšããã®ããŒã¿ã®èŠæ±ããŸãã¯çµæã®ãªãããã·ãŒãžã£ã®åŒã³åºã
- ç¬èªã®ããžãã¯-æ¢åã®ããŒã¿ã®æäœ
ãµãŒãã¹ã«ã€ããŠèããŠã¿ãŸãããã
@Service
@RequiredArgsConstructor
public class SomeService {
private final SomeRepository someRepository; // dependency injection
public int tripleMethod(int numberId) {
Integer fromDB = someRepository.findOne(numberId); // dependency call
int res = fromDB * 3; // own logic
return res;
}
}
åæ§ã®ç¶æ³ããããŸããsomeRepositoryäŸåé¢ä¿ãæ¿å ¥ããã¡ãœããã¯äŸåé¢ä¿ãšããèªäœã®ããžãã¯ã«ã¢ã¯ã»ã¹ããããšã§æ§æãããŸãã
æåŸã«ããªããžããªã¯ãç°¡åã«ããããã«ãããŒã¿ããŒã¹ãªãã§å®è¡ãããŸãã
@Repository
public class SomeRepository {
public Integer findOne(Integer id){
return id;
}
}
findOneæ¡ä»¶ä»ãã¡ãœããã¯ãããããããŒã¿ããŒã¹ã§èå¥åã«ãã£ãŠå€ãæ€çŽ¢ããŸãããåã«åãæŽæ°ãè¿ããŸããããã¯ããã®äŸã®æ¬è³ªã«ã¯åœ±é¿ããŸããã
ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšãæ§æãããURLã«ãã£ãŠæ¬¡ã®ããã«è¡šç€ºãããŸã
ãã¬ã€ã€ãŒãïŒçç£äž...
ããããããã¹ã...
æ¬è³ªã«ã€ããŠå°ãããã¹ããæžãããšãåµé çãªããã»ã¹ã§ãïŒãããã£ãŠããç§ã¯ãã¹ã¿ãŒã§ã¯ãªãéçºè ã§ãããšããèšãèš³ã¯ãŸã£ããäžé©åã§ããåªããæ©èœæ§ãšåæ§ã«ãåªãããã¹ãã«ã¯åµæå·¥å€«ãšçŸãããå¿ èŠã§ãããããããŸã第äžã«ããã¹ãã®åºæ¬çãªæ§é ãæ±ºå®ããå¿ èŠããããŸãã
ãã¹ãã¯ã©ã¹ã«ã¯ãã¿ãŒã²ããã¯ã©ã¹ã®ã¡ãœããããã¹ãããã¡ãœãããå«ãŸããŠããŸããåãã¹ãã¡ãœããã«å«ããå¿ èŠã®ããæå°å€ã¯ãæ¡ä»¶ä»ãã§æ¬¡ã®ããã«èšãã°ãã¿ãŒã²ããã¯ã©ã¹ã®å¯Ÿå¿ããã¡ãœããã®åŒã³åºãã§ãã
@Test
void someMethod_test() {
// prepare...
int res = someService.someMethod();
// check...
}
ãã®èª²é¡ã¯ãæºåãšã¬ãã¥ãŒã«å²ãŸããŠããå¯èœæ§ããããŸããå ¥ååŒæ°ãå«ãããŒã¿ã®æºåãšã¢ãã¯ã®åäœã®èª¬æãçµæã®æ€èšŒã¯éåžžãæåŸ å€ãšã®æ¯èŒã§ããæåŸ ãããåäœããã£ããã£ããããšãèŠããŠããŸããïŒå šäœãšããŠããã¹ãã¯ç¶æ³ãã·ãã¥ã¬ãŒãããæåŸ ã©ããã«åæ ŒããæåŸ ãããçµæãè¿ããããšãèšé²ããã·ããªãªã§ãã
äŸãšããŠã³ã³ãããŒã©ãŒã䜿çšããŠããã¹ããäœæããããã®åºæ¬çãªã¢ã«ãŽãªãºã ã詳现ã«èª¬æããŠã¿ãŸãããããŸããã¿ãŒã²ããã³ã³ãããŒã©ãŒã¡ãœããã¯int numberIdãã©ã¡ãŒã¿ãŒãåããŸãããããã¹ã¯ãªããã«è¿œå ããŸãããïŒ
int numberId = 42; // input path variable
åãnumberIdãããµãŒãã¹ã¡ãœãããžã®å ¥åã«è»¢éäžã«éä¿¡ãããŸããæ¬¡ã«ããµãŒãã¹ã¢ãã¯ãæäŸããŸãã
@MockBean
private SomeService someService;
ã³ã³ãããŒã©èªäœã®ã¡ãœããã³ãŒãã¯ããµãŒãã¹ããåãåã£ãçµæãåŠçããŸãããã®çµæãšããããè¿ãåŒã³åºããã·ãã¥ã¬ãŒãããŸãã
int serviceRes = numberId*3; // result from mock someService
// prepare someService.tripleMethod behavior
when(someService.tripleMethod(eq(numberId))).thenReturn(serviceRes);
ãã®ãšã³ããªã¯ããsomeService.tripleMethodãnumberIdã«çããåŒæ°ã§åŒã³åºãããå ŽåãserviceResã®å€ãè¿ããããšãæå³ããŸãã
ããã«ããã®ãšã³ããªã¯ããã®ãµãŒãã¹ã¡ãœãããåŒã³åºãå¿ èŠããããšããäºå®ããã£ããã£ããŸããããã¯éèŠãªãã€ã³ãã§ããçµæã®ãªãããã·ãŒãžã£ã®åŒã³åºããä¿®æ£ããå¿ èŠãããå Žåã¯ãéåžžã¯å¥ã®è¡šèšæ³ã䜿çšãããŸã-ã...ã®å Žåã¯äœãããªããïŒ
Mockito.doNothing().when(someService).someMethod(eq(someParam));
ç¹°ãè¿ãã«ãªããŸãããããã¯someServiceã®äœæ¥ã®åãªãæš¡å£ã§ãããsomeServiceã®åäœã詳现ã«ä¿®æ£ããæ£çŽãªãã¹ããåå¥ã«å®è£ ãããŸããããã«ãããã§ã¯ã次ã®ããã«èšè¿°ããå Žåãå€ã3åã«ãªãããšãéèŠã§ã¯ãããŸããã
int serviceRes = numberId*5;
ããã¯çŸåšã®ã¹ã¯ãªãããå£ãããšã¯ãããŸãããããã§ãã£ããã£ãããã®ã¯someServiceã®åäœã§ã¯ãªããsomeServiceã®çµæãåœç¶ã®ããšãšèŠãªãã³ã³ãããŒã©ã®åäœã§ããã¿ãŒã²ããã¯ã©ã¹ã¯æ¿å ¥ãããäŸåé¢ä¿ã®åäœãæ åœã§ããŸãããããããä¿¡é Œããå¿ èŠããããããããã¯å®å šã«è«ççã§ãã
ãããã£ãŠãã¹ã¯ãªããã§ã¢ãã¯ã®åäœãå®çŸ©ããŸããããããã£ãŠããã¹ããå®è¡ãããšãã«ãã¿ãŒã²ããã¡ãœããã®åŒã³åºãå ã§ã¢ãã¯ã«å°éãããšãèŠæ±ããããã®ïŒserviceResïŒãè¿ãããã³ã³ãããŒã©ãŒèªäœã®ã³ãŒãããã®å€ã§æ©èœããŸãã
次ã«ãã¹ã¯ãªããå ã®ã¿ãŒã²ããã¡ãœãããåŒã³åºããŸããã³ã³ãããŒã©ã¡ãœããã«ã¯ç¹æ®æ§ããããŸããã³ãŒãã§ã¯æç€ºçã«åŒã³åºãããŸããããHTTP GETã¡ãœãããšURLãä»ããŠãã€ã³ããããããããã¹ãã§ã¯ç¹å¥ãªãã¹ãã¯ã©ã€ã¢ã³ããä»ããŠåŒã³åºãããŸããSpringã§ã¯ãããã¯MockMvcã§ããä»ã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ãSymfonyã®WebTestCase.createClientãªã©ã®é¡äŒŒç©ããããŸãããããã£ãŠãããã«ãGETãšURLã«ãããããã³ã°ãä»ããŠã³ã³ãããŒã©ãŒã¡ãœãããå®è¡ããã®ã¯ç°¡åã§ãã
//// mockMvc.perform
MockHttpServletRequestBuilder requestConfig = MockMvcRequestBuilders.get(SomeController.PATH_GET_TRIPLE, numberId);
MvcResult mvcResult = mockMvc.perform(requestConfig)
.andExpect(status().isOk())
//.andDo(MockMvcResultHandlers.print())
.andReturn()
;//// mockMvc.perform
ãŸãããã®ãããªãããã³ã°ãååšããããšã確èªãããŸããåŒã³åºããæåããå Žåãçµæã確èªããŠä¿®æ£ããããšã«ãªããŸããããšãã°ãã¢ãã¯ã¡ãœãããåŒã³åºãããåæ°ãä¿®æ£ã§ããŸãã
// check of calling
Mockito.verify(someService, Mockito.atLeastOnce()).tripleMethod(eq(numberId));
ç§ãã¡ã®å Žåãããã¯åé·ã§ããwhenã®å¯äžã®åŒã³åºãã¯ãã§ã«ä¿®æ£ãããŠããŸããããã®æ¹æ³ãé©åãªå ŽåããããŸãã
ãããŠä»ãäž»ãªããš-ã³ã³ãããŒã©ãŒèªäœã®ã³ãŒãã®åäœããã§ãã¯ããŸãïŒ
// check of result
assertEquals(SomeController.RESP_PREFIX+serviceRes, mvcResult.getResponse().getContentAsString());
ããã§ãã¡ãœããèªäœã®åå ãä¿®æ£ããŸãããsomeServiceããåä¿¡ããçµæã¯ãã³ã³ãããŒã©ãŒãã¬ãã£ãã¯ã¹ãšé£çµãããå¿çã®æ¬æã«å ¥ãã®ã¯ãã®è¡ã§ããã¡ãªã¿ã«ãã³ã¡ã³ããå€ããšããã£ã®å 容ãèªåã®ç®ã§èŠãããšãã§ããŸã
//.andDo(MockMvcResultHandlers.print())
ãã ããéåžžããã®ã³ã³ãœãŒã«ãžã®å°å·ã¯ããããã°ã®è£å©ãšããŠã®ã¿äœ¿çšãããŸãã
ãããã£ãŠãã³ã³ãããŒã©ãŒãã¹ãã¯ã©ã¹ã«ãã¹ãã¡ãœããããããŸãã
@WebMvcTest(SomeController.class)
class SomeControllerTest {
@MockBean
private SomeService someService;
@Autowired
private MockMvc mockMvc;
@Test
void triple() throws Exception {
int numberId = 42; // input path variable
int serviceRes = numberId*3; // result from mock someService
// prepare someService.tripleMethod behavior
when(someService.tripleMethod(eq(numberId))).thenReturn(serviceRes);
//// mockMvc.perform
MockHttpServletRequestBuilder requestConfig = MockMvcRequestBuilders.get(SomeController.PATH_GET_TRIPLE, numberId);
MvcResult mvcResult = mockMvc.perform(requestConfig)
.andExpect(status().isOk())
//.andDo(MockMvcResultHandlers.print())
.andReturn()
;//// mockMvc.perform
// check of calling
Mockito.verify(someService, Mockito.atLeastOnce()).tripleMethod(eq(numberId));
// check of result
assertEquals(SomeController.RESP_PREFIX+serviceRes, mvcResult.getResponse().getContentAsString());
}
}
次ã«ãsomeService.tripleMethodã¡ãœãããæ£çŽã«ãã¹ãããŸããåæ§ã«ãäŸåé¢ä¿ã®åŒã³åºããšç¬èªã®ã³ãŒãããããŸããä»»æã®å ¥ååŒæ°ãæºåããsomeRepositoryäŸåé¢ä¿ã®åäœãã·ãã¥ã¬ãŒãããŸãã
int numberId = 42;
when(someRepository.findOne(eq(numberId))).then(AdditionalAnswers.returnsFirstArg());
翻蚳ïŒãsomeRepository.findOneãnumberIdã«çããåŒæ°ã§åŒã³åºãããå ŽåãåãåŒæ°ãè¿ããŸãããåæ§ã®ç¶æ³-ããã§ã¯äŸåã®è«çããã§ãã¯ããŸãããããã®èšèãåãå ¥ããŸãããã®ã¡ãœããå ã®äŸåé¢ä¿ãžã®åŒã³åºãã®ã¿ããã£ããã£ããŸããããã§ã®ååã¯ããµãŒãã¹èªäœã®ããžãã¯ããã®è²¬ä»»ç¯å²ã§ãïŒ
assertEquals(numberId*3, res);
ãªããžããªããåãåã£ãå€ã¯ãã¡ãœããèªäœã®ããžãã¯ã«ãã£ãŠ3åã«ããå¿ èŠãããããšãä¿®æ£ããŸãããçŸåšããã®ãã¹ãã¯ãã®èŠä»¶ãä¿è·ããŠããŸãã
@ExtendWith(MockitoExtension.class)
class SomeServiceTest {
@Mock
private SomeRepository someRepository; // ,
@InjectMocks
private SomeService someService; // ,
@Test
void tripleMethod() {
int numberId = 42;
when(someRepository.findOne(eq(numberId))).then(AdditionalAnswers.returnsFirstArg());
int res = someService.tripleMethod(numberId);
assertEquals(numberId*3, res);
}
}
ç§ãã¡ã®ãªããžããªã¯æ¡ä»¶ä»ãã§ããã¡ãã§ããããããã¹ãã¯é©åã§ããããšã倿ããŸããã
class SomeRepositoryTest {
// no dependency injection
private final SomeRepository someRepository = new SomeRepository();
@Test
void findOne() {
int id = 777;
Integer fromDB = someRepository.findOne(id);
assertEquals(id, fromDB);
}
}
ãã ããããã§ããæºåãåŒã³åºããæ€èšŒãšããã¹ã±ã«ãã³å šäœãæŽã£ãŠããŸãããããã£ãŠãsomeRepository.findOneã®æ£ããåäœãä¿®æ£ãããŸãã
å®éã®ãªããžããªã§ã¯ãã¡ã¢ãªãŸãã¯ãã¹ãã³ã³ããã§ããŒã¿ããŒã¹ãèµ·åããæ§é ãšããŒã¿ãç§»è¡ããå Žåã«ãã£ãŠã¯ãã¹ãã¬ã³ãŒããæ¿å ¥ããŠãã¹ãããå¿ èŠããããŸããããã¯å€ãã®å Žåãæé·ã®ãã¹ãã¬ã€ã€ãŒã§ãããããã»ã©éèŠã§ã¯ãããŸãããæ£åžžãªç§»è¡ãã¢ãã«ã®ä¿åãæ£ããéžæãªã©ãèšé²ãããŸããããŒã¿ããŒã¹ãã¹ãã®æ§æã¯ãã®èšäºã®ç¯å²ãè¶ ããŠããŸãããããã¥ã¢ã«ã§è©³çްã«èª¬æãããŠããŸãããªããžããªã«ã¯äŸåé¢ä¿ã®æ¿å ¥ã¯ãªããå¿ èŠãããŸããããã®ã¿ã¹ã¯ã¯ããŒã¿ããŒã¹ãæäœããããšã§ããç§ãã¡ã®å Žåã¯ãã¬ã³ãŒããããŒã¿ããŒã¹ã«äºåã«ä¿åãããã®åŸIDã§æ€çŽ¢ãããã¹ãã«ãªããŸãã
ãã®ããã«ããŠãæ©èœãã§ãŒã³å šäœãå®å šã«ã«ããŒããããšãã§ããŸãããåãã¹ãã¯ãç¬èªã®ã³ãŒããå®è¡ãããã¹ãŠã®äŸåé¢ä¿ãžã®åŒã³åºãããã£ããã£ããŸããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãã§ã¯ãå®å šãªã³ã³ããã¹ãã¬ã€ãºã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå®è¡ããå¿ èŠã¯ãããŸãããããã¯ãå°é£ã§æéãããããŸããè¿ éã§ç°¡åãªãŠããããã¹ãã§æ©èœãç¶æããããšã§ãå¿«é©ã§ä¿¡é Œæ§ã®é«ãäœæ¥ç°å¢ãå®çŸããŸãã
ããã«ããã¹ãã«ãã£ãŠã³ãŒãã®å質ãåäžããŸããã¬ã€ã€ãŒã§ã®ç¬ç«ãããã¹ãã®äžç°ãšããŠãã³ãŒããã©ã®ããã«ç·šæããããåèããå¿ èŠãããããšããããããŸããããšãã°ãã¡ãœããã¯æåã«ãµãŒãã¹ã§äœæãããå°ããã¯ãªããç¬èªã®ã³ãŒããšã¢ãã¯ã®äž¡æ¹ãå«ãŸããŠããŸããããšãã°ãã¡ãœãããåå²ããæå³ããªããå®å šã«ãã¹ãã§ã«ããŒãããŠããŸãããã¹ãŠã®æºåãšãã§ãã¯ãå®çŸ©ãããŠããŸããæ¬¡ã«ã誰ããæåã®ã¡ãœãããåŒã³åºã2çªç®ã®ã¡ãœããããµãŒãã¹ã«è¿œå ããããšã«ããŸããããã€ãŠã¯äžè¬çãªç¶æ³ã®ããã§ããããã¹ãã®å¯Ÿè±¡ç¯å²ã«ãªããšãäœããè¶³ããŸãã... 2çªç®ã®æ¹æ³ã§ã¯ã2çªç®ã®ã·ããªãªã説æããæåã®æºåã·ããªãªãè€è£œããå¿ èŠããããŸããïŒçµå±ã®ãšããããã¹ããããã¯ã©ã¹èªäœã®æåã®ã¡ãœãããããã¯ããããšã¯ã§ããŸããã
ããããããã®å Žåãã³ãŒãã®å¥ã®ç·šæã«ã€ããŠèããã®ãé©åã§ãã2ã€ã®å察ã®ã¢ãããŒãããããŸãïŒ
- æåã®ã¡ãœãããããµãŒãã¹ãžã®äŸåé¢ä¿ãšããŠæ¿å ¥ããããŠãŒãã£ãªãã£ã³ã³ããŒãã³ãã«ç§»åããŸãã
- 2çªç®ã®æ¹æ³ããçµã¿èŸŒã¿ãµãŒãã¹ãŸãã¯è€æ°ã®ãµãŒãã¹ã®ããŸããŸãªæ¹æ³ãçµã¿åããããµãŒãã¹ãã¡ãµãŒãã«ç§»åããŸãã
ãããã®ãªãã·ã§ã³ã¯äž¡æ¹ãšããã¬ã€ã€ãŒãã®ååã«ããŸãé©åããäŸåé¢ä¿ã®ã¢ãã¯ã§äŸ¿å©ã«ãã¹ããããŸããçŸããã¯ãåã¬ã€ã€ãŒãç¬èªã®äœæ¥ãæ åœããããããäžç·ã«ãªã£ãŠãã·ã¹ãã å šäœã®ç¡æµæ§ã®ããã®åŒ·åºãªãã¬ãŒã ã¯ãŒã¯ãäœæããããšã§ãã
è»éã«ä¹ã£ãŠ ...
ã€ã³ã¿ãã¥ãŒã®è³ªåïŒéçºè ã¯ãã±ããå ã§äœåãã¹ããå®è¡ããå¿ èŠããããŸããïŒå¥œããªã ãããã ãå°ãªããšã2åïŒ
- ä»äºãå§ããåã«ããã¹ãŠãåé¡ãªãããšã確èªããåŸã§ããªãã§ã¯ãªãããã§ã«å£ããŠãããã®ãèŠã€ããªãããã«ããŸã
- ä»äºã®çµããã«
ã§ã¯ããªããã¹ããæžãã®ã§ããããïŒæ¬¡ã«ãå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠãèŠããŠäºæž¬ãã䟡å€ããªããããããã¯èªååã«ä»»ããå¿ èŠããããŸããèªåãã¹ããææããŠããªãéçºè ã¯ãå€§èŠæš¡ãªãããžã§ã¯ãã«åå ããæºåãã§ããŠããŸãããã€ã³ã¿ãã¥ãŒå¯Ÿè±¡è ã¯ããã«ãããæããã«ããŸãã
ãããã£ãŠãé«çµŠã®è³æ ŒãåŸããå Žåã¯ããããã®ã¹ãã«ãéçºããããšããå§ãããŸãããã®ãšããµã€ãã£ã³ã°ãªç·Žç¿ã¯ãåºæ¬çãªããšããå§ããããšãã§ããŸããã€ãŸãããæ°ã«å ¥ãã®ãã¬ãŒã ã¯ãŒã¯ã®ãã¬ãŒã ã¯ãŒã¯å ã§ããã¹ãããæ¹æ³ãåŠã³ãŸãã
- äŸåé¢ä¿ãåã蟌ãŸããã³ã³ããŒãã³ããã¢ãã¯æè¡
- ã³ã³ãããŒã©ãŒããªããªã ãšã³ããã€ã³ããåŒã³åºããã¥ã¢ã³ã¹ããããŸã
- DAOããªããžããªããã¹ãããŒã¹ã®åŒãäžããšç§»è¡ãå«ã
ãã®ããããã¹ããªãŒãã®æŠå¿µããè€éãªã¢ããªã±ãŒã·ã§ã³ããã¹ãããææ³ãçè§£ããæè»ã§åŒ·åãªããŒã«ãä»äºã®ããã«ã©ã®ããã«æäŸãããŠããããæããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãããã¡ãããããŒã«ãåªããŠããã»ã©ãããçç·Žããäœæ¥ãå¿ èŠã«ãªããŸãã
ããªãã®ä»äºãšçŽ æŽãããã¹ãã«ããæ¥œãã¿ãã ããïŒ
ãµã³ãã«ã³ãŒãã¯ãgithub.comã®ãªã³ã¯ããå ¥æã§ããŸãïŒhttpsïŒ //github.com/denisorlov/examples/tree/main/unittestidea