用Robolectric编写Android单元测试

搭建测试工程

如果你的Android项目还不存在测试项目,那么你需要跟着下面的步骤来创建一个测试项目。

复制依赖

m2文件夹复制到你的用户目录下:c:/Users/xxx(xxx为你的登录用户名称),并修改为.m2

配置Android项目

修改你的Android项目,使得Target SDK version不低于17或高于18。

创建测试工程

测试工程是普通的Java项目而不是Android项目,且需要JDK 7以上。

File → New → Java Project…
Project Name: compass-unittest(根据你的项目名称修改,这里以罗盘项目为例)
点击Finish创建项目。 将libs目录拷贝到测试项目中。

然后打开项目的Build Path配置界面。

添加对被测Android项目的依赖

在“New Java Project”对话框中选择 “Projects” 选项卡
点击 “Add…”
选择 “compass”(你的Android项目)
点击 “OK”

添加必需的库

在“New Java Project”对话框的顶部选择 “Libraries”
点击 “Add JARS”
选择“libs”下的所有jar包, 点击 “OK”

点击 “Add External Jars”
导航到你的SDK安装目录,然后选择“platforms/android-xx/android.jar”, 选择对应你的Android项目Target API的目录。 点击 “Open” 导入android.jar

在“New Java Project”对话框顶部选择 “Order and Export” 选项卡,选中android.jar, 把它移动到robolectric jars的下面。
点击 “Finish”, 关闭“New Java project”对话框。

导入测试工程到Eclipse

如果你的版本控制系统里已经存在测试工程,那么你只需要检出代码并导入Eclipse。

从Clear Case签出测试工程“compass-unittest”。在Eclipse里导入工程,需要注意此工程是“Java Project”而不是“Android Project”。

安装依赖

双击执行compass-unittest\setup\setup.bat

配置Run Configuration

如果不做这一步,测试是跑不起来的。因为Robolectric找不到项目中使用到的资源。

点击 “Run” → “Run Configurations…”
双击 “JUnit” (不是 “Android JUnit Test”)
Name: CompassTests
选择 “Run all tests in the selected project, package or source folder:” 单元框
点击 “Search” 按钮
选择 “CompassTest”
Test runner: JUnit 4
点击对话框底部的链接 “Multiple launchers available Select one…”
选择 “Use configuration specific settings”
选择 “Eclipse JUnit Launcher”
点击 “OK” 点击 “Arguments” 选项卡 在 “Working directory:” 处选择 “Other:” 单选框 点击 “Workspace…” 选择 “compass” (不是 “compass-unittest”, 在 ‘Other’ 编辑框中的值应该是 ‘{workspace_loc:compass}’), 然后点击 “OK”
点击 “Apply” 然后点击 “Close”

运行测试

“Run” → “Run Configurations…” 选择 “JUnit” → “CompassTests” 点击 “Run”

编写第一个测试

package com.example.myproject;

import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;

@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {

    @Test
    public void should_show_notification_if_lost_connection() throws Exception {
        // Given
        activity = Robolectric.buildActivity(MainActivity.class).create().get();

        // When
        disconnectNetwork();

        // Then
        notificationBar = activity.findViewById(R.id.notification_bar);
        assertThat(notificationBar).isVisible();

}

1 在测试类上指定TestRunner;
2 使用@Test注解测试方法;
3 用测试方法名称描述你的业务;
4 将测试代码分为三部分;
5 第一部分Given是准备条件,就是测试依赖的数据或环境;
6 第二部分When是触发被测方法,比如点击某个按钮;
7 第三部分Then是验证结果,看程序是否做出了正确的响应。