小编Ske*_*Dev的帖子

使用Android架构组件处理输入

TL; DR

如何处理主动更改数据的活动(例如通过EditText)?我是否继续在旋转时将状态保存在SavedInstanceState中,并且只在所有字段都准备就绪时使用ViewModel,或者是否有办法让ViewModel负责检查/保持/使用UI的数据?

我正在使用Google的Arch开发我的应用程序.组件和编写我的最新课程我注意到,在处理来自活动表单的数据时,我不确定最佳实践是什么.

我有一个由标题,描述,位置,类型组成的POJO

我有四个EditText上的活动:title_et,description_et,location_et,type_et.

我的ViewModel,通过一个Repository(这里不相关),可以在sendObject调用函数时将对象发送到数据库.

我现在怎么做

该活动有mTitle,mDescription,mLocation,mType.在旋转时,活动会保存包中的所有EditText值savedInstanceState,并再次加载它们以填充视图.

当用户想要发送对象时,它会单击一个按钮,并且活动会viewModel.sendObject(mTitle, mDescription, mLocation, mType)在必要的检查后调用该函数.

这种方法存在问题

该活动负责保存/检查EditTexts的所有数据,基本上使ViewModel只负责与Repository的交互.

我想要完成什么

理想情况下,我想让Activity只负责UI,将所有内容委托给ViewModel.

这样我就可以调用sendObject(),ViewModel已经拥有了所有需要的数据.

LiveData情况

现在,ViewModel只有一个LiveData实例,里面有一个Resource(从这里取出),它用于"告诉"Activity新数据已经到达或发生了错误.

这种方法适用于仅从网络接收数据并显示它们的所有活动.当我想同步来自活动的数据时,我该怎么办?我是否为每个字段使用一个LiveData并使用它来显示潜在的错误?

我已经阅读了大部分样本,但所有的活动都是被动的.

结论

感谢任何花时间提供帮助的人.

android mvvm android-architecture-components

6
推荐指数
1
解决办法
610
查看次数

单元测试 - 如何构建 Firebase 模拟?

我正在使用 Mockito 框架对我的应用程序进行单元测试。

TL; 博士

我应该为类的每个可能结果创建一个模拟并在@Before 中设置它们的行为,还是应该为每个类只创建一个模拟,然后在使用它们的每个测试中定义它们的行为?

语境

现在我正在测试DataRepository,有getPosts(String postId)。通过 DIDataRepository接收FirebaseFirestore实例。

getPosts返回Maybe<List<Post>>带有以下代码的 a:

fun getPosts(companyId: String): Maybe<List<Post>> {
    return Maybe.create { emitter ->
        firestore.collection("companies/$companyId/posts").get()
                .addOnCompleteListener {
                    if (it.isSuccessful) {
                        if (it.result.isEmpty) {
                            emitter.onComplete()
                        } else {
                            emitter.onSuccess(it.result.toObjects(Post::class.java))
                        }
                    } else {
                        emitter.onError(it.exception ?: UnknownError())
                    }
                }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

为了测试这个函数和各种情况(成功/空/失败),我必须模拟 FirebaseFirestore,然后是 CollectionReference,然后是任务,然后是 OnCompleteListener(带有参数捕获器)等等。基本上什么都有。

当我嘲笑任务时,我应该

一种。创建一个successfulTaskMock我在@Before 中设置的总是成功的和失败的?与有效/空validQuerySnapshot/相同的事情emptyQuerySnapshot

湾 只创建一个taskMock然后在测试中直接改变它的返回值?(使 taskMock.isSuccessful 在成功测试中返回 …

junit unit-testing mockito firebase google-cloud-firestore

5
推荐指数
0
解决办法
716
查看次数