티스토리 뷰
728x90
반응형
Example을 통해서 Mockito가 어떻게 test case를 쉽게 만들어 주는지 알아보자.
우선 테스트 케이스는 다른 사이트에서 가져왔음을 알린다. ㅋㅋ
대신 나는 여기에 스토리를 추가해 보겠다.
A팀과 B팀이 프로젝트를 진행중이다.
A팀은 번역기를 만드는 역활을 맡았고, B팀은 자동 번역기능이 추가되어 있는 채팅 프로그램을 만들기로 했다.
자!!! J는 B팀의 팀원으로 최초 채팅방에 조인했을때 "안녕하세요 누구님" 이라는 글을 찍어주는 로직을 만드는 task를 맡았다. 물론 외국인이 들어오면 외국인에게는 그나라 말로 인사말이 찍혀야 한다.
J는 자리에 앉아서 고민을 하며 test case를 만들기 시작했다. 그런데 아무리 해도 test case가 만들어지지 않는다.
가장 큰 문제점은 바로 J가 만들어야 하는 부분은 A팀에서 만들고 있는 번역기에 dependency가 있다는 것이다. 그것이 아직 만들어 지지 않는 시점에서 어떻게 만들어야 할까?
J는 예전방식으로 dummy 객체를 만들어서 하려고 한다. 그런데 옆에 있던 PM이 필요없는 class는 절대 만들지 말라고 협박을 하고 간다. 아...dummy객체를 만들었다간 괜히 욕먹을 것 같다는 공포가 엄습한다. 그러던 중 J옆에 있던 K가 mock framework을 한번 써보라고 권유는 한다. 그건 굳이 dummy 객체를 안만들어도 괜찮다는 말에 Googling 시작...
처음이라 그런지 시간이 조금 지났지만 테스트 케이스를 만들었다.
1 Step
자 .. 일단 내 임의 대로 ITranslator 를 하나 만들었다.(번역기를 제공해주는 팀에 막내에게 현재 외부로 열려있는 interface에 대해 물어봤지만 아직 그런게 없다길래 )
2 Step
그리고 내가 구현해야 하는 Greeting class를 하나 만들었고 ITranslator를 넘겨주기로 했다.
Mockit을 이용해서 ITranslator object를 만들고, 물론 실제 class파일은 없다, Greeting 객체에 파람으로 넘겨준다.
3 Step
그리고 when(condition).thenReturn(value) 기능을 이용해서 영어로 Hello 를 Italian 로 번역을 요청하면 무조건 Ciau가 나오도록 stubbing을 한다.
4 Step
그리고 Paulo이라는 사람이 입장하면 Ciau Paulo라는 String이 나오도록 test case를 완성!!.
5 Step
그리고 마지막으로 정말 mock으로 생성된 번역기의 translate라는 메소드가 실제로 호출이 되었는지 확인한다. 다시 말해서 앞으로 실제 번역기가 완성되어 integration 하더라도 이 메소드는 무조건 잘 불린것이라는 확신을 하기 위한 테스트이다.문제가 생긴다면 아마도 실제 구현상의 문제가 될것이다.
좀 복잡한가? 복잡하다면 대충 글을 읽고 소스를 보자.. 그것이 훨씬 이해하기 쉬울것이다.
아래는 실제소스이다.
ITranslator의 concrete 구현물이 없더라도 테스트는 무사통과 된다. 굳이 dummy class를 만들 필요가 없어진것이다.
ㅋㅋ J finially finish the task and go to a cafe to take a break!!
우선 테스트 케이스는 다른 사이트에서 가져왔음을 알린다. ㅋㅋ
대신 나는 여기에 스토리를 추가해 보겠다.
A팀과 B팀이 프로젝트를 진행중이다.
A팀은 번역기를 만드는 역활을 맡았고, B팀은 자동 번역기능이 추가되어 있는 채팅 프로그램을 만들기로 했다.
자!!! J는 B팀의 팀원으로 최초 채팅방에 조인했을때 "안녕하세요 누구님" 이라는 글을 찍어주는 로직을 만드는 task를 맡았다. 물론 외국인이 들어오면 외국인에게는 그나라 말로 인사말이 찍혀야 한다.
J는 자리에 앉아서 고민을 하며 test case를 만들기 시작했다. 그런데 아무리 해도 test case가 만들어지지 않는다.
가장 큰 문제점은 바로 J가 만들어야 하는 부분은 A팀에서 만들고 있는 번역기에 dependency가 있다는 것이다. 그것이 아직 만들어 지지 않는 시점에서 어떻게 만들어야 할까?
J는 예전방식으로 dummy 객체를 만들어서 하려고 한다. 그런데 옆에 있던 PM이 필요없는 class는 절대 만들지 말라고 협박을 하고 간다. 아...dummy객체를 만들었다간 괜히 욕먹을 것 같다는 공포가 엄습한다. 그러던 중 J옆에 있던 K가 mock framework을 한번 써보라고 권유는 한다. 그건 굳이 dummy 객체를 안만들어도 괜찮다는 말에 Googling 시작...
처음이라 그런지 시간이 조금 지났지만 테스트 케이스를 만들었다.
@Test public void shouldTestGreetingInItalian(){ //setup ITranslator mockTranslator = mock(ITranslator.class); //1 step Greeting greeting = new Greeting(mockTranslator); //2 step when(mockTranslator.translate("English", "Italian", "Hello")).thenReturn("Ciau"); //3 step //execute assertEquals("Ciau Paulo", greeting.sayHello("Italian", "Paulo")); //4 step //verify verify(mockTranslator).translate("English", "Italian", "Hello"); //5 step } |
1 Step
자 .. 일단 내 임의 대로 ITranslator 를 하나 만들었다.(번역기를 제공해주는 팀에 막내에게 현재 외부로 열려있는 interface에 대해 물어봤지만 아직 그런게 없다길래 )
2 Step
그리고 내가 구현해야 하는 Greeting class를 하나 만들었고 ITranslator를 넘겨주기로 했다.
Mockit을 이용해서 ITranslator object를 만들고, 물론 실제 class파일은 없다, Greeting 객체에 파람으로 넘겨준다.
3 Step
그리고 when(condition).thenReturn(value) 기능을 이용해서 영어로 Hello 를 Italian 로 번역을 요청하면 무조건 Ciau가 나오도록 stubbing을 한다.
4 Step
그리고 Paulo이라는 사람이 입장하면 Ciau Paulo라는 String이 나오도록 test case를 완성!!.
5 Step
그리고 마지막으로 정말 mock으로 생성된 번역기의 translate라는 메소드가 실제로 호출이 되었는지 확인한다. 다시 말해서 앞으로 실제 번역기가 완성되어 integration 하더라도 이 메소드는 무조건 잘 불린것이라는 확신을 하기 위한 테스트이다.문제가 생긴다면 아마도 실제 구현상의 문제가 될것이다.
좀 복잡한가? 복잡하다면 대충 글을 읽고 소스를 보자.. 그것이 훨씬 이해하기 쉬울것이다.
아래는 실제소스이다.
package com.jhouse.mockito.examples; public class Greeting { private ITranslator translator; public Greeting(ITranslator mockTranslator) { this.translator = mockTranslator; } public String sayHello(String lang, String name) { return translator.translate("English", lang, "Hello") +" "+ name; } } |
package com.jhouse.mockito.examples; public interface ITranslator { public abstract String translate(String fromLang, String toLang, String msg); } |
ITranslator의 concrete 구현물이 없더라도 테스트는 무사통과 된다. 굳이 dummy class를 만들 필요가 없어진것이다.
ㅋㅋ J finially finish the task and go to a cafe to take a break!!
반응형
'이제 관심밖의 IT 기술 > ETC' 카테고리의 다른 글
Byteman Best Practical 1 - (parameter value, AT INVOKE) (0) | 2014.11.13 |
---|---|
Mockito Framework 이란? (0) | 2011.10.27 |
Junit 4 Assertion 사용을 위한 기본세팅 (0) | 2011.10.26 |
JUnit4 특징설명 (0) | 2011.10.26 |
JUnit3 example (0) | 2011.10.26 |
댓글
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Jay
- Certificate
- Red Hat
- certification
- cert
- 벌링턴
- 캐나다부동산
- 밀튼
- basement
- docker
- TORONTO
- 미시사가
- 우드워킹
- 부모님초청이민
- 부동산분석
- 옥빌
- 토론토정착서비스
- BTBS
- redhat
- ansible
- git proGit
- RHEL
- 인터넷
- BC주
- 캐나다
- Canada
- 정착서비스
- RHCE
- 토론토
- 온타리오
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
글 보관함