您好,我是 TDD 新手,只是想开始探索。
我有一个用例“RegisterAccount”,它将从用户那里获取一些注册信息(我们将其命名为“RegistrationInfo”),将其发送到服务器,获取成功状态并响应用户(成功、失败或连接问题)。
现在我从一个测试用例开始,测试当注册成功时,用例将通知 UI 显示成功消息。所以我会有:
verify(registrationPresenter, times(1)).showRegistrationSuccessed();
作为我想要的结果(顺便说一句,我正在使用 Mockito 来模拟对象)。同时,我将有一个注册信息对象,该对象未被模拟:
RegistrationInfo info = new RegistrationInfo(username, password, email);
和模拟的演示者一起以及注册服务类:
RegistrationPresenter registrationPresenter = Mockito.mock(RegistrationPresenter);
RegistrationService registrationService = Mockito.mock(RegistrationService.class);
现在,当我开始考虑将这三部分链接在一起时,我不知道是否必须使此服务调用同步或异步。
任何理智的开发人员都知道,我们不能在主线程中放置任何网络 I/O 来中断 UI 渲染,因此这个用例在某些时候需要转移到后台(线程、执行器、异步任务等)。
我的第一个问题是我是否应该将此用例设计为同步并让服务层处理异步调用?或者以异步方式设计用例本身?
第二个问题是,使用 java 并发实用程序(或任何其他方式)中的 callback 或 FutureTask 是否可以更好地实现异步方法?
提前谢谢您。
最佳答案
看看http://codelabs.developers.google.com/codelabs/android-testing/index.html
这里演示者实现了“用例”逻辑,并且异步实现在存储库级别完成。
如果您应用干净/六角形拱门概念:
http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
存储库和交互器(用例实现)应用异步。 Presenter 使用交互器并管理其事件。
如果您的演示者监听 View 事件(“处理 View 异步”),为什么不对用例/存储库事件执行相同的操作并“处理用例异步”?
此示例具有不同的回调实现:第一个定义并实现自己的回调,第二个使用下标/观察者和线程控制。
希望对你有帮助!
关于java - 在 TDD 中设计异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36082092/