Я пытаюсь создать модульные тесты для моего примера приложения, используя архитектуру MVVM. в этом сценарии я пытаюсь создать тест для метода, который выполняет вставку, в этом случае я вызываю метод ViewModel, который вызывает репозиторий, передающий текст вставке, а мой репозиторий, в свою очередь, вызывает вставку класса Dao, а затем возвращает новый список теперь со вставленным этим новым элементом. Но в моем тесте мой объект LiveData имеет нулевой
класс ViewModel
class MainViewModel(private val todoRepository: TodoRepository) : ViewModel() {
private val _todos = MutableLiveData<List<Todo>>()
fun observeTodos() = _todos
fun insertNewTask(text: String){
viewModelScope.launch {
val result = todoRepository.insertTask(text)
_todos.value = result
}
}
}
класс репозитория
class TodoRepositoryImpl(context: Context): TodoRepository {
val db =
AppDatabase.invoke(
context
)
override suspend fun insertTask(text: String): List<Todo> {
db.myDao().addItem(Todo(text = text))
return db.myDao().getItems()
}
}
мой тестовый класс
@ExperimentalCoroutinesApi
@RunWith(JUnit4::class)
class MainViewModelTest {
@Rule
@JvmField
val rule = InstantTaskExecutorRule()
private val repository = mock(TodoRepository::class.java)
private lateinit var viewModel: MainViewModel
@Before
fun setUp() {
viewModel = MainViewModel(repository)
}
@Test
fun should_insertNewTodo() = runBlockingTest {
//given
val result = MutableLiveData<List<Todo>>()
val returnedList = createTodoList()
whenever(repository.getAllTodos()).thenReturn(returnedList)
//when
viewModel.insertNewTask("newTask")
result.value = viewModel.observeTodos().value
//than
verify(repository).insertTask(anyString())
assertEquals(returnedList, result.value)
}
fun createTodoList(): List<Todo>{
val mockList = listOf(Todo(id = 1, text = "FIRST", completed = false),
Todo(id = 2, text = "SECOND", completed = false),
Todo(id = 3, text = "THIRD", completed = true)
)
return mockList
}
}
Я думаю, что это легко, но я не знаю, как ее решить, тест не пройден с таким ответом:
Expected :[Todo(id=1, text=FIRST, completed=false), Todo(id=2, text=SECOND, completed=false), Todo(id=3, text=THIRD, completed=true)]
Actual :null