Android Модульный тест LiveData.value возвращает ноль - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь создать модульные тесты для моего примера приложения, используя архитектуру 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

1 Ответ

0 голосов
/ 01 марта 2020

Для решения этой проблемы я просто упускаю одну вещь, мой метод viewmodel.insertTask () не вызывает repository.getAllTodos (), тогда мой всякий раз, когда неправильно !!! правильное значение:

@Test
fun should_insertNewTodo() = runBlockingTest {

    //given
    val returnedList = createTodoList()
    whenever(repository.insertTask(anyString())).thenReturn(returnedList)

    //when
    viewModel.insertNewTask("newTask")
    val result = viewModel.observeTodos().value

    //than
    verify(repository).insertTask(anyString())
    assertEquals(returnedList, result)

}
...