因為使用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
沒有留言:
張貼留言