2014年1月22日 星期三

Robolectric介紹(一) shadow

Why Use Robolectric

因為使用android 模擬器跑test的速度實在是太慢了, Robolectric讓我們可以再IDE上面run TDD
run test的速度也快得多。

安裝的介紹在  Android 開發 (十六) 使用Mockito和Robolectric寫 test case 裡面有詳細的介紹

今天要介紹的是shadowOf的應用


What is shadowOf  

有時候 android並未提供某些method Robolectric的 shadowOf就提供的那些method供我們測試用
舉例來說

在MainActivity的  UI為


    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

我們希望測試ImageView 的 src在程式中是否為 R.drawable.ic_launcher
我們寫出下面的測試

 public void TestDrawable()
 { 
  MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().visible().get();
  ImageView img = (ImageView) activity.findViewById(R.id.img);
  ShadowImageView shadowImageView = Robolectric.shadowOf(img);
  assertEquals(Robolectric.shadowOf(
    shadowImageView.getDrawable()).getCreatedFromResId(),
    R.drawable.ic_launcher);
 }


上面是測試案例,先取得imageview接著
使用shadowOf 取得 shadowImageView
然後比較android:src 是否為  R.drawable.ic_launcher
使用test之後可以看到是綠燈。


shadowOf還有其他的功能
例如以下的程式


 @Override
 public void onClick(View arg0) {
  // TODO Auto-generated method stub
  startActivity(RecentActivityActivity.class);
 }

在click的時候切換到名為 RecentActivityActivity 的Activity
我們希望在測試的時候測試當click之後是否會切換到正確的activity


 @Test
 public void TestActivity()
 {
  MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().visible().get();
  Button btn= (Button)activity.findViewById(R.id.btn);
  btn.performClick();
  ShadowActivity shadowActivity = Robolectric.shadowOf(activity);
  Intent startedIntent = shadowActivity.getNextStartedActivity();
     ShadowIntent shadowIntent =Robolectric.shadowOf(startedIntent);
  assertThat(shadowIntent.getComponent().getClassName(), equalTo(RecentActivityActivity.class.getName()));
 }

上面的程式碼使用 btn.performClick() 觸發 onclick event
接著取得 shadowIntent 並且  判斷新的 intent名稱是否為 RecentActivityActivity


另外一個常用的測試項目,判斷字串是否正確


 @Test
 public void TestHelloWorld()
 {
  MainActivity activity = Robolectric.buildActivity(MainActivity.class).create().visible().get();
  TextView txt = (TextView)activity.findViewById(R.id.txt);
  
  ShadowTextView shadowTextView = Robolectric.shadowOf(txt);

  assertEquals(shadowTextView.innerText(),activity.getString(R.string.hello_world));

 }

使用 shadowTextView 的 innerText 來判斷 字串是否相同
最後附上 sample code

沒有留言:

張貼留言