Android ServiceTestCase

此篇主要試探討如何測試Android Service Class.

若測試中和Android API較無關係的話, 我們可將測試檔案放於module-name/src/test/java/ 路徑下.

若與Android API 相關的測試, 需將測試檔案放於module-name/src/androidTest/java/ 路徑下.

(請參閱 Android App Test 基本概念)

在此篇我們使用Wifi 開關來做例子, 與Android API 相關,

所以需將測試檔案放於module-name/src/androidTest/java/ 路徑下

Step 1: 建造Service 類別

建造Service 類別, 並新增函數為開啟Wifi

MainService.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
26
27
28
29
30
public class MainService extends Service {
private final String TAG = "Nick MainService";

private final IBinder myLocalBinder = new ServiceBinder();
public class ServiceBinder extends Binder {
public MainService getService() {
return MainService.this;
}
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
return myLocalBinder;
}

public void onCreate() {
Log.w(TAG,"onCreate");

}

public void enableWifi() {
WifiManager wifiManager = (WifiManager) this.getSystemService(WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
}

public void onDestroy() {
Log.w(TAG,"onDestroy");
}
}

Step 2: 建立測試檔

利用 Ctrl + Shift + T 建立 MainServiceTest.java

並繼承 InstrumentationTestCase

Step 3: 測試

測試 startService 與 bindService

測試 startService

1
2
3
4
5
6
7
8
9
@SmallTest
public void testStartable() {
Intent startIntent = new Intent();
startIntent.setClass(getContext(), MainService.class);
startService(startIntent);

MainService service = (MainService) getService();
assertNotNull(service);
}

測試 bindService

1
2
3
4
5
6
7
8
9
10
@MediumTest
public void testBindable() {
Intent startIntent = new Intent();
startIntent.setClass(getContext(), MainService.class);
IBinder serviceBinder = bindService(startIntent);
assertNotNull(serviceBinder);

MainService service = ((MainService.ServiceBinder) serviceBinder).getService();
assertNotNull(service);
}

Step 4: 測試開啟Wifi 功能

於setUp 取得context控制權, 並於tearDown() 釋放context控制權

1
2
3
4
5
6
7
8
9
10
11
12
@Override
public void setUp() throws Exception {
super.setUp();
Log.w(TAG, "setUp");
mContext = getContext();
}
@Override
public void tearDown() throws Exception {
Log.w(TAG, "tearDown");
mContext = null;
super.tearDown();
}

測試開啟Wifi 功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@MediumTest
public void testEnableWifi() throws InterruptedException {
Intent startIntent = new Intent();
startIntent.setClass(getContext(), MainService.class);
IBinder serviceBinder = bindService(startIntent);
assertNotNull(serviceBinder);

MainService service = ((MainService.ServiceBinder) serviceBinder).getService();
assertNotNull(service);
service.enableWifi();

Thread.sleep(1000);

WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
assertEquals(true, wifiManager.isWifiEnabled());
}

Source Code

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class MainServiceTest extends ServiceTestCase {
private final String TAG = "Nick MainServiceTest";
private Context mContext;

public MainServiceTest() {
super(MainService.class);

}

@Override
public void setUp() throws Exception {
super.setUp();
Log.w(TAG, "setUp");
mContext = getContext();
}

@SmallTest
public void testStartable() {
Intent startIntent = new Intent();
startIntent.setClass(getContext(), MainService.class);
startService(startIntent);

MainService service = (MainService) getService();
assertNotNull(service);
}

@MediumTest
public void testBindable() {
Intent startIntent = new Intent();
startIntent.setClass(getContext(), MainService.class);
IBinder serviceBinder = bindService(startIntent);
assertNotNull(serviceBinder);

MainService service = ((MainService.ServiceBinder) serviceBinder).getService();
assertNotNull(service);
}

@MediumTest
public void testEnableWifi() throws InterruptedException {
Intent startIntent = new Intent();
startIntent.setClass(getContext(), MainService.class);
IBinder serviceBinder = bindService(startIntent);
assertNotNull(serviceBinder);

MainService service = ((MainService.ServiceBinder) serviceBinder).getService();
assertNotNull(service);
service.enableWifi();

Thread.sleep(1000);

WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
assertEquals(true, wifiManager.isWifiEnabled());
}

@Override
public void tearDown() throws Exception {
Log.w(TAG, "tearDown");
mContext = null;
super.tearDown();
}
}
作者

Nick Lin

發表於

2016-08-14

更新於

2023-01-18

許可協議


評論