Как выполнить модульное тестирование заводских и усовершенствованных функций ViewModel - PullRequest
0 голосов
/ 08 июня 2019

Я следовал руководству о том, как правильно использовать модели представлений в kotlin, и хочу убедиться, что я все тестирую модулем.

Вот фабрика моделей представлений, которая требуетв создателе

class BaseViewModelFactory<T>(val creator: () -> T) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return creator() as T
    }
}

Вот функция расширения, которую я использую для вызова фабрики и передачи ей модели представления.

inline fun <reified T : ViewModel> FragmentActivity.getViewModel(noinline creator: (() -> T)? = null): T {
    return if (creator == null)
        ViewModelProviders.of(this).get(T::class.java)
    else
        ViewModelProviders.of(this, BaseViewModelFactory(creator)).get(T::class.java)
}

Затем в упражнении я использую следующееЧтобы лениво загрузить модель вида, используя функции расширения.

val model: MainViewModel by lazy {
        getViewModel { MainViewModel() }
    }

Все отлично работает.Но я изо всех сил пытаюсь выяснить, как выполнить модульное тестирование BaseViewModelFactory и функций расширения.

Вот моя попытка:

@RunWith(JUnit4::class)
class BaseViewModelFactoryTest {

    // test string
    private val testString = "testString"

    @Rule @JvmField
    public val activityTestRule = ActivityTestRule(MainActivity::class.java)

    // a custom inner test view model for testing base view model
    inner class TestViewModel: BaseViewModel() {
        var test: String = ""

        init {
            test = testString
        }
    }

    // lazy loads the model the same way activities do
    val model: TestViewModel by lazy {
        activityTestRule.activity.getViewModel { TestViewModel() }
    }

    @Before
    fun setUp() {
    }

    @Test
    fun view_model_loaded() {
        assertEquals("The string in the model should be set",testString, model.test)
    }
}

Это дает мне ошибку, хотя

java.lang.IllegalStateException: No instrumentation registered! Must run under a registering instrumentation.

Насколько я понимаю, ActivityTestRule работает только в AndroidTests, так как для работы требуется инструмент.

Моя проблема заключается в том, что я не уверен, как лучше правильно выполнить модульное тестирование функций расширения или фабрики модели представления.

Может кто-нибудь помочь мне правильно написать тесты для этих двух вещей.

...