Android База данных Firebase Junit4. Как издеваться над базой детей? - PullRequest
0 голосов
/ 04 апреля 2020

Нужна помощь с тестированием моего приложения. Я хочу проверить viewmodel fun writeNewTask () . Он должен добавить Task объект в базу данных под родителями под названием tasks и персональный id каждой задачи.

fun writeNewTask(name: String?, orphanage: String?) {
        val id = database.push().key!!
        val task = Task(id, name, orphanage)
        database.child("tasks").child(id).setValue(task)
    }

I'm используя PowerMock. Вот так выглядит мой тест

@RunWith(PowerMockRunner::class)
@PowerMockRunnerDelegate(JUnit4::class)
@PrepareForTest(FirebaseDatabase::class, AddTaskViewModel::class, DatabaseReference::class)
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
class AddTaskViewModelTest {

    @Mock
    lateinit var mockedDatabase: FirebaseDatabase
    @Mock
    lateinit var databaseReference: DatabaseReference
    @Mock
    lateinit var viewModel: AddTaskViewModel

    @Before
    fun before() {
        viewModel = PowerMockito.mock(AddTaskViewModel::class.java)
        databaseReference = PowerMockito.mock(DatabaseReference::class.java)

        PowerMockito.mockStatic(AddTaskViewModel::class.java)
        PowerMockito.mockStatic(DatabaseReference::class.java)

        PowerMockito.mockStatic(FirebaseDatabase::class.java)
        `when`(FirebaseDatabase.getInstance()).thenReturn(mockedDatabase)

        mockedDatabase = PowerMockito.mock(FirebaseDatabase::class.java)
        `when`(mockedDatabase.reference).thenReturn(databaseReference)
    }

    @Test
    fun writeNewTaskTest() {
        val id = "1"
        `when`(databaseReference.key).thenReturn(id)
        val name = "name"
        val orphanage = "orphanage"
        val task = Task(id, name, orphanage)

        viewModel.writeNewTask(name, orphanage)

        verify(databaseReference)
            .child("tasks")
            .child(id)
            .setValue(task)
    }
}

И я улавливаю эту ошибку. После отладки я выяснил, что child ("задачи") равен null

databaseReference.child("tasks");
-> at com.example.application.viewModel.AddTaskViewModelTest.writeNewTaskTest(AddTaskViewModelTest.kt:59)
Actually, there were zero interactions with this mock.

Wanted but not invoked:
databaseReference.child("tasks");
-> at com.example.application.viewModel.AddTaskViewModelTest.writeNewTaskTest(AddTaskViewModelTest.kt:59)
Actually, there were zero interactions with this mock.

1 Ответ

0 голосов
/ 04 апреля 2020

Это происходит из-за того, что ссылка на вашу базу данных отличается от той, что у вас есть в ViewModel. Итак, давайте представим, что у вас есть ViewModel, который получает базу данных в своем конструкторе следующим образом:

class AddTaskViewModel(private val database: FirebaseDatabase): ViewModel()

Итак, чтобы протестировать вашу ViewModel, вам нужно создать его экземпляр, а не издеваться над ним. Что в вашем коде должно выглядеть так:

@Before
fun before() {
    databaseReference = mock(DatabaseReference::class.java)
    mockedDatabase = mock(FirebaseDatabase::class.java)
    `when`(mockedDatabase.reference).thenReturn(databaseReference)

    viewModel = AddTaskViewModel(mockedDatabase)
}

Также вам не нужен PowerMockito для проверки этого, достаточно самого Mockito

...