Android Viewmodel 测试从 Room 检索空关系对象

问题描述

我在测试视图模型时遇到问题。当我在设备上运行它时,它可以工作,但是当运行 AndroidJunit4 测试时,它无法从 Room 数据库加载对象。在这种情况下,对象是在视图模型中检索到的对象,它是一个 one-to-many 关系,正如文档中所述。

我已经查看了数据库检查器,并且在运行 start() 函数之前,所有数据都在数据库中。

enter image description here

有人知道我做错了什么吗?是我不应该使用真实的数据库进行测试,还是在从测试调用函数中启动协程时存在一些问题?

viewmodel 测试

const Field = ({ defaultValue,onChange }) => (
  <input defaultValue={defaultValue} onChange={onChange} />
);

const Test = () => {
  const [first,setFirst] = useState("");
  const [second,setSecond] = useState("");

  return (
    <Datatable
      noText
      pageSize={1}
      showPagination={false}
      data={[{ userName: "asdas",email: "asdsad" }]}
      columns={[
        {
          Header: "www",accessor: "userName",Cell: (
            <Field
              defaultValue={first}
              onChange={(e) => setFirst(e.currentTarget.value)}
            />
          )
        },{
          Header: "Email",accessor: "email",Cell: (
            <Field
              defaultValue={second}
              onChange={(e) => setSecond(e.currentTarget.value)}
            />
          )
        }
      ]}
    />
  );
};

视图模型类


    //variable

    @Test
    @Before
    fun initializeDatabase() = runBlocking {
        val context = ApplicationProvider.getApplicationContext<Context>()
        database = Room.inMemoryDatabaseBuilder(context,AppDatabase::class.java).build()
        scheduledTreatmentRepository = DefaultScheduledTreatmentRepository.getInstance(
            database.scheduledTreatmentDao(),database.scheduledTreatmentCrossRefDao()
        )
        val customerRepository = CustomerRepository.getInstance(database.customerDao())

        viewmodel = AddEditTreatmentviewmodel(customerRepository,scheduledTreatmentRepository)


    }

    @After
    fun closeDb() {
        database.close()
    }

    @Test
    fun start_validId_loadsValues() = runBlocking {

        val time = 100L
                         
        val scheduledTreatment = ScheduledTreatment(
            id = 11,treatmentId = treatment.id,treatmentTime = Calendar.getInstance().apply { timeInMillis = time },timeTemplateId = timeTemplate.id,messageId = message.id
        )
        database.scheduledTreatmentDao().insert(scheduledTreatment)
        val scheduledTreatmentCustomerCrossRef =
            ScheduledTreatmentCustomerCrossRef(11,receiver1.id)
        database.scheduledTreatmentCrossRefDao().insert(scheduledTreatmentCustomerCrossRef)
             
        //Starts a coroutine and loads in the values in the viewmodel
                   \/
        viewmodel.start(11)
        //                                    Value never set
        //                                    \/
        assertthat(viewmodel.customers.getorAwaitValue(),`is`(mutablelistof(receiver1)))

        assertthat(viewmodel.message.getorAwaitValue(),`is`(messages))
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)