Я пытаюсь проверить, что ViewModel успешно внедрил в него хранилище в тесте.Тем не менее, я получаю NPE.Код отлично работает для реального приложения, но не для теста.Я думаю, что это не правильно найти мою ViewModel.
Это код:
package com.waynecovell.kotlinbasics
import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModel
import com.waynecovell.kotlinbasics.data.Workout
import com.waynecovell.kotlinbasics.data.WorkoutRepository
import com.waynecovell.kotlinbasics.data.WorkoutRepositoryTestImpl
import com.waynecovell.kotlinbasics.ui.WorkoutViewModel
import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.koin.android.viewmodel.ext.koin.viewModel
import org.koin.dsl.module.Module
import org.koin.dsl.module.module
import org.koin.standalone.StandAloneContext.startKoin
import org.koin.standalone.StandAloneContext.stopKoin
import org.koin.standalone.inject
import org.koin.test.KoinTest
import org.koin.test.declareMock
import org.mockito.Mock
import org.mockito.MockitoAnnotations
class WorkoutKoinTest : KoinTest {
val viewModel: WorkoutViewModel by inject<WorkoutViewModel>()
val repository by inject<WorkoutRepository>()
@Mock
lateinit var uiData: Observer<List<Workout>>
val workoutModule : Module = module {
viewModel { WorkoutViewModel(get()) }
single<WorkoutRepository> { WorkoutRepositoryTestImpl() }
}
@Before
fun before() {
MockitoAnnotations.initMocks(this)
startKoin(
listOf(workoutModule)
)
declareMock<WorkoutViewModel>()
//declareMock<WorkoutRepository>()
}
@After
fun after() {
stopKoin()
}
@Test
fun testKoinRepo() {
//data
val workouts = repository.getWorkouts()
//observe
viewModel.getWorkouts().observeForever(uiData)
//has data
Assert.assertNotNull(viewModel.workoutData.value)
}
}
Журнал монет:
2019-03-06 17:33:21:771 (KOIN)::[i] [PrintLogger] display debug = false
2019-03-06 17:33:21:803 (KOIN)::[i] [definition] declare Factory [name='WorkoutViewModel',class='com.waynecovell.kotlinbasics.ui.WorkoutViewModel']
2019-03-06 17:33:21:803 (KOIN)::[i] [definition] declare Single [name='WorkoutRepository',class='com.waynecovell.kotlinbasics.data.WorkoutRepository']
2019-03-06 17:33:21:803 (KOIN)::[i] [modules] loaded 2 definitions
2019-03-06 17:33:21:803 (KOIN)::[i] [modules] loaded in 5.670703 ms
2019-03-06 17:33:21:803 (KOIN)::[i] [Koin] started in 28.810215 ms
2019-03-06 17:33:21:804 (KOIN)::[i] [mock] declare mock for class com.waynecovell.kotlinbasics.ui.WorkoutViewModel (Kotlin reflection is not available)
2019-03-06 17:33:21:804 (KOIN)::[i] [definition] override Factory [name='WorkoutViewModel',class='com.waynecovell.kotlinbasics.ui.WorkoutViewModel']
2019-03-06 17:33:21:809 (KOIN)::[i] +-- 'com.waynecovell.kotlinbasics.ui.WorkoutViewModel'
2019-03-06 17:33:21:870 (KOIN)::[i] \-- (*) Created
2019-03-06 17:33:21:873 (KOIN)::[i] +-- 'com.waynecovell.kotlinbasics.data.WorkoutRepository'
2019-03-06 17:33:21:876 (KOIN)::[i] \-- (*) Created
2019-03-06 17:33:21:876 (KOIN)::[i] +-- 'com.waynecovell.kotlinbasics.ui.WorkoutViewModel'
2019-03-06 17:33:21:877 (KOIN)::[i] \-- (*) Created
2019-03-06 17:33:21:898 (KOIN)::[i] [Koin] close context
NPE:
java.lang.NullPointerException
at com.waynecovell.kotlinbasics.WorkoutKoinTest.testKoinRepo(WorkoutKoinTest.kt:59)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)