Androidx ServiceTestRule找不到我的服务

时间:2019-07-07 12:42:17

标签: android-service android-testing androidx android-instrumentation

为了公平起见,我不是在测试服务,而是在我的测试课程中使用了一项服务来测试蓝牙库。因此,我的测试类需要创建一个调用蓝牙库的服务。然后,测试类需要绑定到该服务以执行测试。但是,尝试启动服务总是会给我以下错误,导致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的蓝牙有问题,并且在某些平台上,蓝牙自发地关闭然后重新启动。我的蓝牙库尝试从此关机中恢复。对于每次自发关闭和恢复,恢复都可以进行,但是会出现服务泄漏。这就是我要在简化的框架而不是成熟的应用程序中解决的问题。

0 个答案:

没有答案