gpt4 book ai didi

Android:对服务进行单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:07 25 4
gpt4 key购买 nike

我目前正在尝试使用 TDD 编写 Android 应用程序。我接到了编写一项在应用程序中非常重要的服务的任务。

至于这个原因,我正在尝试为该服务编写一个适当的测试。 Android 准则规定如下:

The topic What To Test lists general considerations for testing Android components. Here are some specific guidelines for testing a Service:

  • Ensure that the onCreate() is called in response to Context.startService() or Context.bindService(). Similarly, you should ensure that onDestroy() is called in response to Context.stopService(), Context.unbindService(), stopSelf(), or stopSelfResult(). Test that your Service correctly handles multiple calls from Context.startService(). Only the first call triggers Service.onCreate(), but all calls trigger a call to Service.onStartCommand().

  • In addition, remember that startService() calls don't nest, so a single call to Context.stopService() or Service.stopSelf() (but not stopSelf(int)) will stop the Service. You should test that your Service stops at the correct point.

  • Test any business logic that your Service implements. Business logic includes checking for invalid values, financial and arithmetic calculations, and so forth.

Source: Service Testing | Android Developers

我还没有看到对这些生命周期方法、对 Context.startService() 的多次调用等的适当测试。我正在尝试解决这个问题,但我目前不知所措。

我正在尝试使用 ServiceTestCase 类测试服务:

import java.util.List;

import CoreManagerService;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Before;
import org.junit.Test;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
import android.content.Intent;
import android.test.ServiceTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;

/**
*
* This test should be executed on an actual device as recommended in the testing fundamentals.
* http://developer.android.com/tools/testing/testing_android.html#WhatToTest
*
* The following page describes tests that should be written for a service.
* http://developer.android.com/tools/testing/service_testing.html
* TODO: Write tests that check the proper execution of the service's life cycle.
*
*/
public class CoreManagerTest extends ServiceTestCase<CoreManagerService> {

/** Tag for logging */
private final static String TAG = CoreManagerTest.class.getName();

public CoreManagerTest () {
super(CoreManagerService.class);
}

public CoreManagerTest(Class<CoreManagerService> serviceClass) {
super(serviceClass);

// If not provided, then the ServiceTestCase will create it's own mock
// Context.
// setContext();
// The same goes for Application.
// setApplication();

Log.d(TAG, "Start of the Service test.");
}

@SmallTest
public void testPreConditions() {
}

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

@Before
public void setUp() throws Exception {
super.setUp();
}

@After
public void tearDown() throws Exception {
super.tearDown();
}

@Test
public void testStartingService() {
getSystemContext().startService(new Intent(getSystemContext(), CoreManagerService.class));

isServiceRunning();
}

private void isServiceRunning() {
final ActivityManager activityManager = (ActivityManager)this.getSystemContext()
.getSystemService(Context.ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager
.getRunningServices(Integer.MAX_VALUE);

boolean serviceFound = false;
for (RunningServiceInfo runningServiceInfo : services) {
if (runningServiceInfo.service.getClassName().equals(
CoreManagerService.class.toString())) {
serviceFound = true;
}
}
assertTrue(serviceFound);
}
}

我是不是处理错了?我应该使用 Activity 测试来测试服务的绑定(bind)吗?

最佳答案

有一个 example using JUnit 4 :

服务:

/**
* {@link Service} that generates random numbers.
* <p>
* A seed for the random number generator can be set via the {@link Intent} passed to
* {@link #onBind(Intent)}.
*/
public class LocalService extends Service {
// Used as a key for the Intent.
public static final String SEED_KEY = "SEED_KEY";

// Binder given to clients
private final IBinder mBinder = new LocalBinder();

// Random number generator
private Random mGenerator = new Random();

private long mSeed;

@Override
public IBinder onBind(Intent intent) {
// If the Intent comes with a seed for the number generator, apply it.
if (intent.hasExtra(SEED_KEY)) {
mSeed = intent.getLongExtra(SEED_KEY, 0);
mGenerator.setSeed(mSeed);
}
return mBinder;
}

public class LocalBinder extends Binder {

public LocalService getService() {
// Return this instance of LocalService so clients can call public methods.
return LocalService.this;
}
}

/**
* Returns a random integer in [0, 100).
*/
public int getRandomInt() {
return mGenerator.nextInt(100);
}
}

测试:

public class LocalServiceTest {
@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();

@Test
public void testWithBoundService() throws TimeoutException {
// Create the service Intent.
Intent serviceIntent =
new Intent(InstrumentationRegistry.getTargetContext(), LocalService.class);

// Data can be passed to the service via the Intent.
serviceIntent.putExtra(LocalService.SEED_KEY, 42L);

// Bind the service and grab a reference to the binder.
IBinder binder = mServiceRule.bindService(serviceIntent);

// Get the reference to the service, or you can call public methods on the binder directly.
LocalService service = ((LocalService.LocalBinder) binder).getService();

// Verify that the service is working correctly.
assertThat(service.getRandomInt(), is(any(Integer.class)));
}
}

关于Android:对服务进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22756238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com