Я пишу тесты для базы данных в приложении Android, в Kotlin. Моя база данных реализована с использованием информации LiveData, поэтому у меня есть ViewModel, которая принимает android.app.Application
в качестве аргумента:
class PostViewModel(application: Application) : AndroidViewModel(application) {
private val repository: PostRepository = PostRepository(application)
val allPosts: LiveData<List<PostEntity>>?
init {
// Constructs the PostRepository
allPosts = repository.allPosts
}
// Some functions
}
Так что мне нужно в моем эспрессо-тесте PostViewModel
, и создать его viewModelStoreOwner
:
private lateinit var postViewModel: PostViewModel
@Rule @JvmField
var activityTestRule = ActivityTestRule(MainActivity::class.java)
@Before
fun setup() {
val preferences = InstrumentationRegistry.getInstrumentation()
.targetContext.getSharedPreferences("com.h.pixeldroid.pref", Context.MODE_PRIVATE)
preferences.edit().putString("accessToken", "qwertz").apply()
preferences.edit().putString("domain", "http://localhost").apply()
ActivityScenario.launch(MainActivity::class.java)
AppDatabase.TEST_MODE = true
postViewModel = ViewModelProvider(activityTestRule.activity).get(PostViewModel::class.java)
}
// Some tests
}
Кажется, до сих пор это работает хорошо. Однако ! Для этого теста я предпочел бы использовать ActivityScenarioRule
по причинам (а в do c говорится: «Это правило является обновленной версией ActivityTestRule
. Предыдущая версия устарела и в конечном итоге будет удалена из библиотека в будущем. "Так или иначе, в какой-то момент мне придется использовать его).
Моя проблема в том, что я не могу найти способ получить ViewModelOwner
из ActivityScenarioRule
, чтобы поместить его в качестве аргумента для ViewModelProvider()
, например, путем получения текущей активности (здесь MainActivity::class.java
) или что угодно. Я нахожу только геттер для сценария, который не дает никакой необходимой мне информации ...
Есть ли способ заставить ее работать?