使用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”

版权声明:著作权归作者所有。

相关推荐

Android使用DiffUtil智能地更新RecyclerView

DiffUtil是一个工具类,它会找出两个列表的差异,输出一个更新列表,并且可以用来通知RecyclerView的Adapter更新。使用DiffUtil会使用DiffUtil.Callback来计算两个列表的差异,其中DiffUtil.Callback是一个抽象类,需要我们实现它,它包含了四个抽象方法和一个非抽象方法:getOldListSize():获取旧列表的大小getNewListSize

Android使用Fresco加载图片的用法

在Android的App开发中,延时加载图片是硬需求。有好几个开源的项目也提供了延时加载图片的功能,常用的有:Fresco,Glide和Universal Image Loader。这里主要简单介绍下Fresco。添加依赖在build.gradle添加依赖如下:dependencies {   ...    compi

Java 8使用parallel Stream测试StringBuilder线程安全

我们知道StringBuilder不是线程安全的,但如何证明它非线程安全呢?测试StringBuilder是否线程安全一个简单的思路如下:模拟多个线程并发向StringBuilder实例添加字符,最后检测builder.toString().length()的值是否为添加字符的次数,如果非线程安全会出现builder.toString().length()的值与添加字符的次数不一致。Java&nb

Node.js写内容到文件的通用方法

Node.js目前有三种方法写一个文件:1、fs.write(fd, buffer, offset, length, position, callback)这个方法是没有缓存的,需要等待回调才能确保将buffer写入磁盘。 2、fs.writeFile(filename, data, [encoding], 

使用ANDROID_ID唯一标识Android设备

使用Settings.Secure#ANDROID_ID 会返回每个用户唯一的64位hex字符串,它是在设备首次boot时生成。我们可以使用它来唯一标识Android设备。import android.provider.Settings.Secure; private String android_id = Secure.getString(ge