오늘은 Lars Vogel 라는 친구가 작성한 Mockito 튜토리얼을 공부했습니다. 2012년 6월에 작성해서 2013는 2월에 Revision 됐으니까 아주 최근 글이네요. Mockito 에 대한 기본 설명과 예제가 있고 예제는 안드로이드 프로젝트에서 사용할 때의 예제를 보여 줍니다.
글 제목을 클릭하시면 원본이 있는 페이지로 가실 수 있습니다. 고맙게 자신이 어렵게 얻은 지식을 이렇게 공유해 주고 있는 친구에게 도움을 주는게 기본 예의 아닐까 합니다. 해당 페이지에는 Donation 할 수 있는 링크도 있고 광고도 있으니까 이 중 할 수 있는 방법으로 도움을 주실 수 있을 거예요. :)
Testing with Mockito - Tutorial
Version 1.1
Copyright © 2012, 2013 Lars Vogel
02.05.2013
Testing with Mockito
이 튜토리얼은 이클립스에서 모키토 프레임워크로 테스트 하는 방법을 설명하고 있습니다.
Table of Contents
1. Prerequisites
아래 튜토리얼은 JUnit 프레임워크로 단위테스트하는 것을 기반으로 작성했습니다.
JUnit 를 잘 모르신다면 JUnit Tutorial 를 참조하세요.
Unit testing은 클래스나 메소드별로 별도로 테스팅하는 것을 말합니다.
자바 클래스들은 대개 다른 클래스들에 의존 합니다. mock object는 특정 메소드 호출에 어떤 output을 정의한 인터페이스나 클래스에 대한 dummy implementation을 말합니다. Mock object들은 dependency 없이 테스트 되어야 하는 클래스에 대한 단위테스트를 만들 때 유용하게 사용됩니다.
코드를 작성해서 이 mock object들을 생성하거나 이 클래스들을 simulate 하기 위해 mock framework을 사용할 수 있습니다. Mock frameworks는 runtime에 mock object들을 생성할 수 있도록 하고 그 behavior를 정의할 수 있도록 해 줍니다.
mock object에 대한 고전적인 예제는 data provider를 들 수 있습니다. production에서는 실제 데이터베이스가 사용되지만 테스팅에서는 mock object를 사용해서 데이터베이스를 simulate 해야 합니다. 실제 데이터베이스를 사용할 때와 똑같은 상황을 만들어 놓고 테스트를 해야 되는 거죠.
이 mock object들은 테스트 될 클래스에 제공될 수 있습니다. 그래서 테스트 해야할 클래스가 외부 데이터에 대한 의존(dependency) 없이 동작하고 그 결과를 테스트 할 수 있습니다.
Mock frameworks는 또한 mock object 와의 상호작용(interaction)을 가능하게 해 그에 따른 테스트를 진행할 수 있도록 합니다. 예를 들어 mock object에 의해 call 된 메소드를 테스트를 하는 경우가 이 경우가 되겠죠.
Mockito 프레임워크에 대해서는 Mockito homepage 에 가시면 자세한 내용을 보실 수 있습니다.
Mockito 는 여러분에게 항상 mock objects를 생성할 수 있도록 기능을 제공합니다. 이 mock objects들은 method를 호출할 때 Pass 되도록 할 수 있어 그 메소드를 테스트 할 수 있도록 도와 줍니다.
Mockito 는 mock() 메소드를 call 해서 생성하거나 @Mock annotation에 근거해서 생성할 수 있습니다. annotation이 사용됐다면 MockitoAnnotations.initMocks(this) method call을 사용해서 초기화 해야 합니다.
아래의 예제를 보세요.
public static Intent createQuery(Context context, String query, String value) { Intent i = new Intent(context, MyListActivity.class); i.putExtra("QUERY", query); i.putExtra("VALUE", value); return i; }
이 메소드는 Context 에 대해 mock object를 만들어서 테스트 할 수 있습니다.
package com.vogella.android.mockito.intent.test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.test.AndroidTestCase; import com.vogella.android.mockito.intent.MainActivity; public class MainActivtityTest extends AndroidTestCase { @Mock Context context; @Override protected void setUp() throws Exception { MockitoAnnotations.initMocks(this); } public void testQuery() throws Exception { Intent intent = MainActivity.createQuery(context, "query", "value"); assertNotNull(intent); Bundle extras = intent.getExtras(); assertNotNull(extras); assertEquals("query", extras.getString("QUERY")); assertEquals("value", extras.getString("VALUE")); } }
Note
이 예제 코드는 단지 간단한 사용법을 보여 드리기 위한 겁니다. 이 예제는 안드로이드 프로그래밍을 예로 들었습니다. Android 에서 Mockito를 direct 하게 사용할 수 있습니다.
Tip
Static imports allows you to call static members, i.e. methods and fields of a class directly without specifying the class. If you declare Mockito.* as static member you can access methods like mock()
directly.
Mockito 에는 아주 훌륭한 API 가 있습니다. verify() method 를 사용해서 해당 메소드가 호출 됐는지 여부를 확인 할 수 있습니다.
when(....)thenReturn(....) 를 사용하면 특정 상황에서의 return 값을 정해 줄 수 있습니다.
doReturn(object).when(kdskfsk).methodCall 도 비슷한 일을 합니다.
특정 상황을 체크하기 위해 mock object에 verify() method 를 사용해도 됩니다.
@Spy 나 spy() method 는 real object를 wrap 하기 위해 사용할 수 있습니다. Every call, unless specified otherwise is delegated to the object.
// Lets mock a LinkedList
List list = new LinkedList();
List spy = spy(list);
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);
// this would not work
// real method is called so spy.get(0)
// throws IndexOutOfBoundsException (list is still empty)
when(spy.get(0)).thenReturn("foo");
verifyNoMoreInteractions()는 더이상의 메소드 호출이 없음을 체크할 수 있도록 합니다.
4. Mockito on Android
release 1.9.5 Mockito 부터 Android 에서 direct로 사용할 수 있도록 됐습니다. 안드로이드 테스트 프로젝트에서 Mockito를 사용하려면 안드로이드 테스트 프로젝트의 libs 폴더에 아래 세개의 라이브러리를 추가 하시면 됩니다.
https://mockito.googlecode.com/files/mockito-all-1.9.5.jar http://dexmaker.googlecode.com/files/dexmaker-1.0.jar http://dexmaker.googlecode.com/files/dexmaker-mockito-1.0.jar
5. Thank you
이 글이 괜찮으시다면 도움을 주세요.
여기 로 가시면 도움을 주실 수 있는 방법이 있습니다.
6. Questions and Discussion
질문을 올리시기 전에vogella FAQ 를 먼저 보시면 도움이 되실 겁니다. 이 글을 보시고 질문이 있으시거나 에러를 발견하셨다면 www.vogella.com Google Group를 이용해 주세요. how to create good questions 도 만들었습니다. 이 글을 보시면 여로분께 도움이 되실 겁니다.
'TDD Project' 카테고리의 다른 글
RowFixture Tutorial (Fitnesse) (0) | 2013.08.14 |
---|---|
ActionFixture Tutorial (Fitnesse) (0) | 2013.08.14 |
ColumnFixture Tutorial (Fitnesse) (0) | 2013.08.12 |
Spring Framework에서 jUnit 테스트 만들기 - Mockito 를 중심으로 - (0) | 2013.08.11 |
Fitnesse 사용법 간단 정리 (0) | 2013.08.07 |
jUnit 으로 Private Method 테스트 만들기 2 (0) | 2013.06.10 |
jUnit 으로 Private Method 테스트 만들기 (0) | 2013.06.10 |
TDD from starting from user stories - a top-down style 03 (0) | 2013.06.04 |
TDD from starting from user stories - a top-down style 02 (0) | 2013.06.03 |
TDD from starting from user stories - a top-down style 01 (1) | 2013.05.28 |