在测试我的应用程序时需要一些帮助。 我想验证视图模型是否有趣 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)
}
我正在使用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(“ tasks”)为 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.
答案 0 :(得分:0)
之所以会发生这种情况,是因为您对数据库的引用与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本身就足够了