为了公平起见,我不是在测试服务,而是在我的测试课程中使用了一项服务来测试蓝牙库。因此,我的测试类需要创建一个调用蓝牙库的服务。然后,测试类需要绑定到该服务以执行测试。但是,尝试启动服务总是会给我以下错误,导致Nullpointer异常
W/ActivityManager: Unable to start service Intent { cmp=com.example.androidhdpadapter.test/com.lampreynetworks.ahd.oxp.transport.BluetoothTestService } U=0: not found
在这个阶段,测试类非常简单:
package com.lampreynetworks.ahd.oxp.transport;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ServiceTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.TimeoutException;
import static org.junit.Assert.fail;
@RunWith(AndroidJUnit4.class)
public class AndroidServiceBluetoothAdapterTests
{
private final static String TAG =
AndroidServiceBluetoothAdapterTests.class.getName();
@Rule
public final ServiceTestRule serviceRule = new ServiceTestRule();
@Test
public void testAndroidBluetoothAdapter() throws TimeoutException, InterruptedException
{
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Intent intent = new Intent(context, BluetoothTestService.class);
serviceRule.startService(intent);
Thread.sleep(12000);
IBinder binder = serviceRule.bindService(intent);
BluetoothTestService service = ((BluetoothTestService.TestManagerBinder) binder).getService();
serviceRule.unbindService();
}
}
关于测试服务问题有很多帖子,我已经尝试了所有这些帖子(处理gradle.build文件依赖项,androidx.test和android.support.test之间的冲突等)。我还尝试了在没有ServiceTestRule的情况下以标准方式调用服务,但是这很可能失败了,因为没有用于指定服务的测试的AndroidManifest(我不知道是否可以做到)。
除非实际上正在测试属于应用程序一部分的服务,否则可能无法使用Androidx的ServiceTestRule。在这里,我正在测试通常由服务调用的蓝牙库,该测试服务不是该库的一部分,而是仅存在于androidTests目录中。
我这样做的原因是Android的蓝牙有问题,并且在某些平台上,蓝牙自发地关闭然后重新启动。我的蓝牙库尝试从此关机中恢复。对于每次自发关闭和恢复,恢复都可以进行,但是会出现服务泄漏。这就是我要在简化的框架而不是成熟的应用程序中解决的问题。