2014年1月19日 星期日

Android 開發 (十六) 使用Mockito和Robolectric寫 test case


Mockito library : https://code.google.com/p/mockito/w/list
Robolectric libary : https://github.com/thecodepath/android_guides/wiki/Robolectric-Installation-for-Unit-Testing

這兩個是支援寫test case的framwork,在這裡稍微描述如何安裝簡介
首先是安裝Robolectric
先下載 robolectric jar,  fest-util.jar  fest-android.jar.
接著再想測試的project 裡建立一個 test folder  我的project 為 simpleApp


接著建立一個 Test 的 Java project 這邊必須非常注意,
是java project , 不是 android  project , 也不是 android Junit project。 
在這裡我創建了一個SimpleTest2 project


接著按下next,然後在src那邊按下右鍵,然後 remove from build path,
接著按下Link Additional Source

接著選取想要測試的 project 的 test folder (也就是剛剛創建的simpleApp的test folder)


接著點到project的 tag 將要測試的project 加入  也就是 simpleApp 


接著將Robolectric的lib加入SimpleTest2 lib的folder


接著設定build path 如下圖


接著使用 add Jars 將lib folder內的 jars 加入


接著add library -> JUnit


 使用Junit4

接著add external Jars   android.jar  and maps.jar


接著點選 run -> run configure


接著將test runner 改成 Junit4



接著切換到Argument Tag 然後選取 other radio button 然後點選 workspace ->  
選取要測試的project  SimpleApp


multiple launcher 那邊 ,選取select one  之後選取 Eclipse Junit Launcher



接著在simpleTest2裡創建一個myActivitytest.java
sample code 為

@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

    @Test
    public void shouldHaveHappySmiles() throws Exception {
        String hello = new MainActivity().getResources().getString(R.string.hello_world);
        assertThat(hello, equalTo("Hello world!"));
    }
}  

接著使用 run as -> junit test  就會看到綠色條出現了
install Robolectric 就完成了


接著要安裝  mockito  ,mockito Download
我們可以再已經建構Robolectric上使用 mockito,方法很簡單
只需要將library依照剛剛加入library的方式加入就可以了  如下圖


接著我寫了一個class 

public class NetworkData
{
 private String name;
 
 public String getName()
 {
  return name;
 }
}

NetworkData 的資料必須在網路連接時才有辦法取得
所以我們必須使用Mock假裝資料回傳


package com.codepath.example.simpleapp.test;

import static org.junit.Assert.*;

import org.junit.Test;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;

import com.example.simpleapp.NetworkData;
import com.example.simpleapp.MainActivity;
import com.example.simpleapp.R;


@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

    @Test
    public void shouldHaveHappySmiles() throws Exception {
        String hello = new MainActivity().getResources().getString(R.string.hello_world);
        assertThat(hello, equalTo("Hello world!"));
    }


 @Test
 public void NetworkDataTest(){
  //arrange
  NetworkData i=mock(NetworkData.class);
  when(i.getName()).thenReturn("Hello");
  //act
  String result=i.getName();
  //assert
  assertEquals("Hello", result);
 }
}




在networkTest 裡  可以看到我mock了一個NetworkData,
然後在getName的時候會回傳Hello  ,接著只要確認結果是否跟預期一樣
可以看到綠燈再度亮起。

經過了千辛萬苦的設定,終於就完成了Mockito 和  Robolectric的設定
可以開始寫測試囉~


更多Robolectric的參考資料
http://robolectric.org/customizing.html

沒有留言:

張貼留言