1. 我是否应该仅将Robolectric与JUnit一起在Android应用程序中使用? 2. 我是否应该仅将Mockito与JUnit一起在Android应用程序中使用? 3. 我是否应该同时使用这两个框架? 4. Mockito和Robolectric之间有什么区别?
我已经搜索了Mokito和Robolectric之间的区别,但没有找到合适的答案。请给予建议。
它们的使用方法略有不同,我倾向于在我的项目中同时使用两者。
Mockito
用于创建你的类的mocks。
当你测试某个类时,你会使用Mockito来mock该类的所有依赖项。
尽可能地,大部分测试应该使用mockito。为了实现这一点,大多数人将其代码拆分成MVP等,其中业务逻辑与View逻辑分离。这样,你的业务逻辑(Presenter)对Android库没有任何了解(或依赖),也不需要对它们进行模拟。
Robolectric
是一个包含许多Android类的模拟库。
Robolectric测试运行器在运行测试时将这些“影子对象”注入到实际的Android类中。这就是允许测试在JVM上运行而不启动Android实例的方式。
在使用MVP时,你的View层通常由Activity/Fragment实现,这就是你可以使用Robolectric来模拟这些内容的地方。
注意事项
只有在必要的情况下才使用Robolectric。它基本上重新实现了Android框架的某些部分,但并不总是完全相同。
你可能还需要另一个库,如PowerMock。它允许模拟静态类,例如Math,或者用于模拟静态Android类,如TextUtils。
两者都与JUnit一起使用。
Mockito单独可以涵盖大多数情况。
然而,Robolectric也可以在单元测试中对Android组件(如Activity或Fragment)提供有限的操作(不依赖于Android SDK的仪器测试),这不需要任何模拟器或设备,并且比仪器测试快得多。
我的建议是:在Android中使用Mockito进行单元测试和Espresso进行UI测试,因为它们是半官方的Android测试框架。
如果在Android SDK上有一些依赖关系,请将Robolectric添加到您的单元测试中。
`@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
@Test
public void clickingButton_shouldChangeResultsViewText() throws Exception {
Activity activity = Robolectric.setupActivity(MyActivity.class);
Button button = (Button) activity.findViewById(R.id.press_me_button);
TextView results = (TextView) activity.findViewById(R.id.results_text_view);
button.performClick();
assertThat(results.getText().toString(), equalTo("Testing Android Rocks!"));
}
}`