使用Robolectric写Android单元测试
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”