android 单元测试-Robolectric

这里只将语法,不讲配置。Api3.0

如何得到对应的activity

1
final MainActivity activity = Robolectric.setupActivity(MainActivity.class);

得到activity后,我们可以进行一些操作如下:

1
2
# 检测title
assertTrue(activity.getTitle().toString().equals("MaterialCodeBox"));

再者通过Robolectric.setupActivity方法。最后我们需要转换成ShadowActivity来进行相关的测试操作:

1
ShadowActivity shadowActivity = Shadows.shadowOf(activity);

得到ShadowActivity后,可以进行一下使用(日后补充)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检测Intent
Intent actualIntent = shadowActivity.getNextStartedActivity();
Assert.assertEquals(expectedIntent, actualIntent);

# 检测MenuItem(并没有经过检测,获取到的Menu总是为null)
final Menu menu = shadowActivity.getOptionsMenu();
assertThat(menu.findItem(R.id.item1).getTitle().toString(),equalTo("设置"));

# 检测MenuItem的点击事件后的吐司
shadowActivity.clickMenuItem();
assertThat(ShadowToast.getTextOfLatestToast(),equalTo("Clicked Item 4"));

# 检测receiver的跳转service
Intent serviceItent=Shadows.shadowOf(application).getNextStartedService();

如何检测receiver跳转到service是否可用

1
2
3
4
5
6
7
8
9
10
11
12
13
# 得到顶层的Application的实例
Application application= RuntimeEnvironment.application;

# 创建Itent,用于跳转到service。(receiver的跳转貌似就是这么用的)
Intent expectedService=new Intent(application, SampleIntentService.class);

# 手动执行下receiver,为了产生Intent
new AlarmManagerReceiver().onReceive(application, new Intent());


# 捕捉Intent并进行比较
Intent serviceItent=Shadows.shadowOf(application).getNextStartedService();//也是通过得到ShadowActivity
Assert.assertNotNull(serviceItent);//判断是否为null,即捕捉到
assertEquals(serviceItent.getComponent(),expectedService.getComponent());//进行比较

下面看看AlarmManagerReceiver的代码

1
2
3
4
5
6
7
public class AlarmManagerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intentService = new Intent(context, SampleIntentService.class);
context.startService(intentService);
}
}

捕捉检测SharedPreferences

1
2
3
4
5
6
7
8
9
# 得到类似SharedPreferences的实例,由Robolectric提供
RoboSharedPreferences preferences=(RoboSharedPreferences) RuntimeEnvironment.application
.getSharedPreferences("example", Context.MODE_PRIVATE);

# 跟之前一样进行执行以下:
new SampleIntentService();.onHandleIntent(new Intent());

# 重新得到资源来判断是否一样
Assert.assertNotSame(preferences.getString("SAMPLE_DATA", "sample data"), "");

注意:onHandleIntentprotect,所以在test的文件下,要创建跟app一样存储SampleIntentService的目录,否则无法调用。

注解@Before得到相关(R.id.xx)资源

1
2
3
4
5
6
7
@Before
public void setUp() {
Activity activity = Robolectric.setupActivity(LoginActivity.class);
button = (Button) activity.findViewById(R.id.email_sign_in_button);
emailView = (EditText) activity.findViewById(R.id.email);
passwordView = (EditText) activity.findViewById(R.id.password);
}

得到对应的view后,我们可以进行一下操作:

1
2
# 模拟点击
button.performClick();

模拟虚拟Http网络请求

# Android-使用Mockito、Robolectric和RxJava及Retrofit进行单元测试
详细代码apiApiTest.java

关于Mockito的使用
Mockito:一个强大的用于Java开发的模拟测试框架
JUnit + Mockito 单元测试(二)