티스토리 뷰

이제 관심밖의 IT 기술/ETC

Mockito Framework 이란?

트래이닝맨 2011. 10. 27. 15:07
728x90
반응형
Mock 객체를 만드는 데 있어서 여러가지 방법이 존재한다.
그냥 Dummy로 Class를 만들어도 되지만 이방법은 프로그램하기엔 자유도가 높긴하지만(내맘대로 뭐든지 할수 있다는 얘기지) 프로젝트가 커지면 커질수로 Dummy 역시 너무 많아지고, 중간에 로직이 변경이 큰경우 바꿔야하는  Dummy 객체의 수가 넘쳐 난다는 문제가 있다. 그리고 이름 정하기도 넘 복잡하므로 개인 테스트 말고는 사용하기엔 좀 벅찰듯하다...그래서 요즘 트랜드라고 하는 Mockito Mock Framework에 대해서 공부를 좀 해봤다...은근히 좋아보이긴하지만 아직은 조금 더 해봐야 알듯하다.

일단 Mockito에 대해서 알아보자.
너무나 좋은 글들이 많기 때문에 여기에서는 아주 기본적인 내용만 다루겠다.

우선 Mockito를 만든 사람이 생각하는 Mock 프레임의 이상에 대해 적어본다.
1.단순해야한다.
2.Mock 프레임워크를 DSL로 만들지 말자.(이 프레임워크를 위해 새로운 언어를 공부할 시간이 필요하다는 것자체가 웃긴것이라고 생각)
3.문자열을 메소드 대신에 사용하지 말자.
4.읽기 어려운 anonymous inner 클래스를 사용하지 말자.
5.리팩토링이 어려워서는 안된다.

그리고 이 Mockito가 다른 프레임워크와 다른점은 무엇인가?
 1.테스트 그 자체에 집중한다.
2.테스트 스텁을 만드는 것과 검증을 분리시켰다.
3.Mock 만드는 방법을 단일화했다.
4.테스트 스텁을 만들기 쉽다.
5.API가 간단하다.
6.프레임워크가 지원해주지 않으면 안 되는 코드를 최대한 배제했다.
7.실패시 발생하는 에러추적이 깔끔하다.

사실 Easy mock, jmock 도 제대로 사용해본적은 없기때문에 엄청 말이 땡기진 않네요.. 하지만 몇개의 예제를 만들어보니 예전에 상태기반 테스트(state base test)를 할때와 비교해서 Dummy 객체를 하나도 안만들어도 된다는 점 하나는 좋네요..
사실 Dummy 객체 이름 정하는 것 자체가 은근 Stress였거든요 ^^

자 이제부터 기본 용어에 대해 알아봅시다.
1.스터빙(stubbing)
   Dummy 객체를 하나를 만드는 것과 같다. 좀더 자세히 Dummy 객체에서 원하는 값을 미리 정해 놓고 그것을 Return하게 만드는 것이다. 말은 어렵지만 코드는 보면 매우 쉽다.
when(mockedList.get(0)).thenReturn("first");
위의 내용을 글로 풀이하자면 다음과 같다.
"앞으로 mockedList.get(0)을 요청하는 경우가 있을경우 return값은 first를 돌려줘라"..
이런씩으로 미리 결과값을 정해놓는 것이다.

 이건 Manual에 나온 내용이다.
  • 기본적으로, 값을 리턴하는 모든 메소드들에 대해 mock은 null, 빈 콜렉션(collectionn), 적절한 primitive/primitive wrapper value를 리턴한다.(예: 0, false, ... for int/Integer, boolean/Boolean, ...).
  • 스터빙(Stubbing)은 오버라이드 될 수 있다 : 예를 들어 공통적인 스터빙은 고정 기본 작업(fixture setup)이 가능하고, 테스트 메소드들도 오버라이드가 가능하다. 유념할 부분은 오버라이드된 스터빙(stubbing)은 과도한 스터빙에 대한 코드 냄새(code smell)가 잠재해있다는 점이다.
  • 한번 스텁된(stubbed) 메소드는 몇번 호출되었든지 상관 없이 항상 스텁된 값을 리턴한다.
  • 바로 전 스터빙(stubbinng)은 더욱 중요하다 - 당신이 같은 함수 인자들로 여러번 같은 메소드를 스터빙할 때


2.함수 인자 적합자(matcher)

함수 인자 적합자는 유연한 검증이나 스터빙이 가능하게 한다. 여기(Click here to see)에는 더 많은 기본적으로 내장된 적합자들과 별도 함수 인자 적합자(custom argument matchers), / 햄크레스트 적합자(hamcrest matchers).

별도 함수 인자 적합자에 대한 정보를 얻기 위한 유일한 곳은 ArgumentMatcher 클래스의 자바 독이니 확인을 해보도록 한다.

복잡한 함수 인자 적합(matching)을 사용할 때에는 그에 대한 책임을 가져야 한다. 몇몇 경우에 anyX() 적합자들과 함께 사용되는 equals()를 이용한 자연스러운 적합 스타일은 깨끗하고 간결한 테스트들로 만들어 주는 경향이 있다. 또, 어떤 경우에는 코드를 리팩토링하는 것 보다 equals() 적합이나 테스팅을 돕기 위한 equals() 메소드 구현(implement) 등이 더 나은 경우가 있다.

section 15 나 ArgumentCaptor 클래스에 대한 자바독을 참고하길 바란다. ArgumentCaptor 는 더 나은 단언(assertions)를 위해 함수 인자를 수집(capturinng)하는 특성을 가진 함수 인자 적합자의 구현체이다.

함수 인자 적합자에서 주의할 점:
함수 인자 적합자를 사용 하는 경우, 모든 함수 인자들은 적합자로서 주어져야 한다.

이와 같은 매우 좋은 내용은 이미 manual로 잘 정리 되어 있으니 그것을 참고하기 바란다. 더이상 정리를 한다는 것은 무의미 하므로 여기서 정리한다. ^^

물론 한글 번역본도 있으니 걱정하지 마시길...
한글 메뉴얼 번역본 URL : http://djsuh.springnote.com/pages/5909797
영어 메뉴얼 URL : http://mockito.googlecode.com/svn/branches/1.5/javadoc/org/mockito/Mockito.html


반응형

'이제 관심밖의 IT 기술 > ETC' 카테고리의 다른 글

Byteman Best Practical 1 - (parameter value, AT INVOKE)  (0) 2014.11.13
Mockito Tutorial 1  (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
링크
«   2024/10   »
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 29 30 31
글 보관함