Android单元测试(二)

上篇文中讲到Android单元测试的一些基础知识,以及对Activity、Application的简单单元测试用例,文见http://blog.lujun.co/2015/10/08/android单元测试(一)/。本篇文章,我们接着来探讨一些关于Android中单元测试的常见方法与问题。

一、Service单元测试

在编写Service的代码的时候,就应该考虑测试的时候需要做的事情,比如检查服务的生命周期等。

测试什么?

1、Ensure that the onCreate() is called in response to Context.startService() or Context.bindService(),就是方法对应测试。

2、Test that your Service correctly handles multiple calls from Context.startService(),测试多次调用startService()方法的情况,只有在第一次调用触发 Service.onCreate(),以后都触发调用 Service.onStartCommand()。

3、Test any business logic that your Service implements,业务逻辑测试。

ServiceTestCase

Service单元测试中,主要用到的是ServiceTestCase类,它提供一个隔离的独立环境进行Service单元测试。如同其他测试一样,环境初始化之前可以初始化模拟对象等变量,调用ServiceTestCase.startService()或 ServiceTestCase.bindService()启动服务。

默认情况下,ServiceTestCase调用testAndroidTestCaseSetupProperly()方法测试基类是否成功的创建了一个上下文环境,testServiceTestCaseSetupProperly()测试了Service是否可以被正确的实例化;使用MockApplication模拟对象,调用setApplication()注入该对象。

测试代码如下:

MyService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent){
return null;
}
}

TestService.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class TestService extends ServiceTestCase, MyService; {
private Intent mIntent;
public TestService() {
super(MyService.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
getContext().startService(mIntent = new Intent(getContext(), MyService.class));
}
@Override
protected void tearDown() throws Exception {
getContext().stopService(mIntent);
}
// 测试是否相等
@MediumTest
public void testEqual() {
assertEquals(1, 3);
}
}

测试结果如下图:

结果和文中说明一样,两个默认测试以及自己的测试方法,自己的测试方法运行错误。

二、ContentProvider单元测试

文档这样描述ContentProvider单元测试:A content provider may have many public constants, but it usually has few if any public methods and no public variables. This suggests that you should write your tests based only on the provider’s public members. 我们仅仅需要对有公共成员变量或方法的Provider编写测试用例。

ContentProvider单元测试什么?

1、Test with resolver methods,保证测试ContentProvider时Application使用的是相同的interaction。

2、Test a public provider as a contract,当需要对外公开Provider时(这也是ContentProvider该做的)需要进行此项测试。包括:

a. Test with constants that your provider publicly exposes;

b. Test all the URIs offered by your provider;

c. Test invalid URIs.

3、Test the standard provider interactions,测试保证query, insert, delete, update, getType, 和onCreate()这些方法起作用。

4、Test business logic,业务逻辑肯定是需要测试的。

ProviderTestCase2

ContentProvider单元测试中,主要用到ProviderTestCase2类,它允许我们在一个独立的环境下测试ContentProvider,其中由 IsolatedContextMockContentResolver提供测试环境。

这里就不对ContentProvider单元测试举例了,和Service单元测试类似,只是使用ProviderTestCase2类进行测试。这里有一个测试的示例代码,很简单:https://github.com/Miserlou/Android-SDK-Samples/blob/master/NotePad/tests/src/com/example/android/notepad/NotePadProviderTest.java

源码:https://gitlab.com/lujun/UnitTestDemo

参考:http://developer.android.com/tools/testing/index.html