使用Robolectric写Android单元测试

时间:2022-06-01 18:20:29

Robolectric是一个单元测试框架,运行在jvm上。相对于在Android模拟器或设备上运行测试需要花费一分甚至更长时间,Robolectric只需要几秒钟。

这里简单介绍下使用Robolectric做单元测试。

添加依赖

首先在build.gradle添加Robolectric依赖,并设置android的测试选项unitTests.includeAndroidResources为true

testImplementation  "org.robolectric:robolectric:3.6.1"

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

对于Mac和Linux用户,需要配置Android JUnit的工作目录为$MODULE_DIRS:

Run -> Edit Configurations -> Defaults -> Android Junit -> Working Directory填入$MODULE_DIRS

写测试用例

新建DemoTest

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class DemoTest {
    // 测试代码
}

在DemoTest添加注解:

  • @RunWith,指定测试的Runner为RobolectricTestRunner.class
  • @Config,指定配置的类为BuildConfig

在开始实际的测试之前,可以在@Before的方法上构建activity

@Before
public void setUp() throws Exception {
    activity = Robolectric.buildActivity(FirstActivity.class)
            .create()
            .resume()
            .get();
}

这一步是可选的,在开始测试前构建activity,是为了后续能够在此Activity上执行操作。

测试用例

@Test
public void launchSecondActivity() {
    Intent expectedIntent = new Intent(activity, SecondActivity.class);
    //模拟点击按钮
    activity.findViewById(R.id.launch_second_activity_button).callOnClick();

    //使用Shadows获取实际启动的Activity
    ShadowActivity shadowActivity = Shadows.shadowOf(activity);
    Intent actualIntent = shadowActivity.getNextStartedActivity();

    //检测expectedIntent是否和actualIntent匹配
    assertTrue(expectedIntent.filterEquals(actualIntent));
}

在此测试用例里模拟了按钮的点击事件,检测启动的Activity是否和预期启动的Activity匹配。

接着是运行测试用例:右键选中launchSecondActivity测试方法,选择“Run launchSecondActivity”