使用JUnit +的单元测试用例(Android中的Robolectric或Mockito或两者)

时间:2016-06-09 08:01:38

标签: android mockito junit4 robolectric

这是我第一次在Android中编写单元测试用例。

所以我搜索过很多东西。

  1. Robolectric framewordk - 在JVM上运行
  2. Mockito Framwork - 模拟对象
  3. 所以我对Robolectric& amp; Mokito。

    1. 我是否必须在Android应用中使用Robolectric和JUnit?
    2. 我是否必须在Android应用中仅使用Mockito?
    3. 我是否应该同时使用这两个框架?
    4. Mockito&的区别是什么? Robolectric?
    5. 我在寻找Mokito& Robolectric但没有得到任何正确答案。

      请建议。

3 个答案:

答案 0 :(得分:39)

它们的用法略有不同,我倾向于在我的项目中使用它们。

Mockito

用于制作你的类的模拟。

当您测试某个特定类时,您可以使用Mockito模拟其所有依赖项。

在可能的情况下,大多数测试都应该使用mockito。为了实现这一点,大多数人将代码分解为MVP等,其中业务逻辑与View逻辑分离。这样,您的业务逻辑(Presenter)就不会对Android库有任何知识(或依赖关系),也不需要对它们进行模拟。

Robolectric

是一个包含许多 Android 类模拟的库。

运行测试时,Robolectric测试运行器会注入这些“阴影对象”来代替实际的Android类。这使得测试可以在JVM上运行而无需启动Android实例。

使用MVP时,View层往往由Activity / Fragment实现,您可以使用Robolectric来模拟它们。

备注

仅在必要时使用Robolectric。它基本上重新实现了Android框架的一部分,但并不总是以完全相同的方式实现。

您可能还需要另一个库,例如PowerMock。这允许模拟静态类,例如Math,或者可以用来模拟静态Android类,例如TextUtils。

两者都与JUnit一起使用

答案 1 :(得分:12)

单独Mockito可以涵盖大多数情况。

然而,Robolectric还可以在Android组件上提供有限的操作,例如单元测试中的Activity或Fragment(不是仪器测试,它不依赖于Android SDK),它不需要任何模拟器或设备并且比仪器测试快得多。

我的建议:使用Mockito进行单元测试,使用Espresso进行UI测试,因为它们是Android的半官方测试框架。

如果Android SDK存在某些依赖关系,请在单元测试中添加Robolectric。

答案 2 :(得分:0)

首先,我们需要了解Roboelectric和Mockito是android测试驱动开发中常用的两种不同工具。因此,大多数情况下,您会在同一项目中找到这两种工具。

下面我将解释这两种情况的常见用例-

Mockito 用于模拟依赖关系,这意味着如果要在测试环境中访问真实对象,则需要伪造它,或者我们可以说是模拟它。如今,与对象注入(如匕首)一起对对象进行模拟非常容易。 参考-Unit testing with dagger

Roboelectric 是Android的行业标准单元测试框架。使用Robolectric,您的测试可以在JVM内的模拟Android环境中运行,而无需模拟器的开销。 用roboelectric编写的简单测试是

`@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!"));
}
}`