Как издеваться над классом приложения для модульного тестирования ViewModel

У меня есть View Model, который расширяется AndroidViewModel

class MoveViewModel(application: Application): AndroidViewModel(application),CoroutineScope{
    ....
}

И я хочу провести модульное тестирование, но не могу понять, как смоделировать класс приложения.

@Test
    fun testSearchDataValidation() {
        val application = Mockito.mock(Application::class.java)
        val viewModel = MoveViewModel(application)

        .....
    }

Но когда я запускаю тест, я получаю сообщение об ошибке, которое Mockito не может имитировать Application

org.mockito.exceptions.base.MockitoException: Mockito cannot mock this class: class android.app.Application.

Mockito can only mock non-private & non-final classes.

Как мне издеваться над классом приложения, чтобы передать его в мою модель представления?

Редактировать:

Вот моя иерархия папок, предложенная @farhanjk

Как издеваться над классом приложения для модульного тестирования ViewModel

Вы пытаетесь смоделировать класс приложения в AndroidTest, что не имеет особого смысла, поскольку вы можете получить фактический экземпляр приложения.

lelloman 09.04.2019 23:13

@lelloman не уверен, что вы имеете в виду, я думал, что androidTest предназначен для тех случаев, когда вам нужно работать с инфраструктурой Android, ViewModel использует некоторые общие настройки. Я очень новичок в модульном тестировании в Android, поэтому я не все понимаю полностью, но могу ли я выполнять эти тесты в папке test?

tyczj 10.04.2019 01:23

Если вы действительно проводите модульное тестирование модели представления, вы должны иметь возможность сделать это в папке test, вам нужно будет имитировать все зависимости Android (например, Application или SharedPreferences), тесты в папке androidTest вместо этого имеют доступное ваше фактическое приложение. Вы должны уметь тестировать модели представлений в test, они намного быстрее, чем androidTest.

lelloman 10.04.2019 07:54
6
3
5 370
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Mockito.mock(Application::class.java)

В папке test создайте следующую иерархию:

В файле org.mockito.plugins.MockMaker просто поместите однострочный текст mock-maker-inline.

Издевайтесь над неискаженным: опциональное издевательство над окончательными классами/методами

Мне пришлось обновить мою версию mockito, и она заработала.

tyczj 10.04.2019 01:24

Другие вопросы по теме