Android макет приложения контекста внутри приложения - PullRequest
0 голосов
/ 23 февраля 2020

У меня проблемы с созданием тестового класса. В основном я хочу проверить мой класс модели представления, который выполняет сетевой вызов. Компонент сети класса внедряется с помощью dagger, для проверки соединения требуется параметр контекста, это моя модель представления:

class MyViewModel(application: Application): AndroidViewModel(application) {
   @Inject lateinit var network: NetworkService
    init {
        DaggerNetworkComponent.builder().networkModule(NetworkModule(application.applicationContext))
        .build().inject(this)
        network.callNetwork()
    } 
}

А тестовый класс - это что-то вроде

lateinit var myViewModel: MyViewModel
@Test
fun testMyNetwork() { 
   application =  Mockito.mock(Application::class.java)
   myViewModel = MyViewModel(application)
}

The application.applicationContext всегда возвращает значение null, которое затем возвращает IllegalStateException

Есть ли какое-либо решение для этого?

1 Ответ

1 голос
/ 23 февраля 2020

Я думаю, что здесь есть две возможности. Я использовал второй и знаю, что он работает, первый - мое предположение.

(1)

Вы издеваетесь над приложением. Затем вы пытаетесь использовать его applicationContext, однако вы не издевались над ним. Вам также нужно смоделировать это:

val context  =  Mockito.mock(Context::class.java)
Mockito.`when`(application.applicationContext).thenReturn(context)

(2)

Предположим, 1) ваш тест является приборным тестом 2) вы используете подкласс Application - скажем, MyApplication ,

Затем вам нужно будет создать его подкласс - скажем, TestMyApplication. Следующим шагом будет создание подкласса AndroidJUnitRunner, может выглядеть следующим образом:

public class MyInstrumentationTestRunner extends AndroidJUnitRunner {
    @Override
    public Application newApplication(ClassLoader cl, String className, Context context)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        return Instrumentation.newApplication(TestMyApplication.class, context);
    }
}

Наконец, вам нужно указать android, чтобы использовать этот бегун:

allprojects {
    ext {
        ....
        testInstrumentationRunner = "com...MyInstrumentationTestRunner"
    }
}

Как В результате вышеизложенного контекст приложения будет экземпляром TestMyApplication во всех ваших инструментальных тестах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...