Androidx ServiceTestRule не может найти мой сервис - PullRequest
0 голосов
/ 07 июля 2019

Если честно, я не тестирую сервис, но использую сервис как часть моих тестовых классов для тестирования библиотеки Bluetooth. Таким образом, мой тестовый класс должен создать сервис, который вызывает библиотеку Bluetooth. Затем тестовый класс должен привязаться к этому сервису для выполнения тестов. Тем не менее, попытка запустить службу всегда дает мне следующую ошибку, которая приводит к исключению 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 (не знаю, можно ли это сделать).

Возможно, невозможно использовать ServiceTestRule Androidx, если только вы на самом деле не тестируете сервис, который является частью приложения. Здесь я тестирую библиотеку Bluetooth, которая обычно вызывается службой, и эта служба тестирования НЕ является частью библиотеки, но существует только в каталоге androidTests.

Причина, по которой я это делаю, заключается в том, что в Android глючит Bluetooth, а на некоторых платформах Bluetooth самопроизвольно отключается и затем перезагружается. Моя библиотека Bluetooth пытается восстановиться после этого выключения. Восстановление работает НО при каждом самопроизвольном отключении и восстановлении, я получаю утечку сервиса. Это то, что я пытаюсь решить в упрощенной среде вместо полноценного приложения.

...