У меня есть 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
@lelloman не уверен, что вы имеете в виду, я думал, что androidTest предназначен для тех случаев, когда вам нужно работать с инфраструктурой Android, ViewModel использует некоторые общие настройки. Я очень новичок в модульном тестировании в Android, поэтому я не все понимаю полностью, но могу ли я выполнять эти тесты в папке test?
Если вы действительно проводите модульное тестирование модели представления, вы должны иметь возможность сделать это в папке test, вам нужно будет имитировать все зависимости Android (например, Application или SharedPreferences), тесты в папке androidTest вместо этого имеют доступное ваше фактическое приложение. Вы должны уметь тестировать модели представлений в test, они намного быстрее, чем androidTest.
Mockito.mock(Application::class.java)
В папке test создайте следующую иерархию:
В файле org.mockito.plugins.MockMaker просто поместите однострочный текст mock-maker-inline.
Издевайтесь над неискаженным: опциональное издевательство над окончательными классами/методами
Мне пришлось обновить мою версию mockito, и она заработала.
Вы пытаетесь смоделировать класс приложения в AndroidTest, что не имеет особого смысла, поскольку вы можете получить фактический экземпляр приложения.