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