温馨提示:阅读本文前最好简单使用过 Robolectric。
Robolectric 是基于 Junit 的单元测试框架,实现了在 JVM 上测试 Android 代码的功能。在介绍 Robolectric 前有必要先简单介绍下Junit。
一.Junit介绍
Junit 是 Java 语言的单元测试框架,理论上基于 JVM 的语言都可以使用。本文基于 Junit 4 的源码进行分析,目前最新版本为 Junit 5。
二.Junit源码分析
单元测试的用法很简单。下面以 Calculator
类为例,为其中的 evaluate
方法编写单元测试:
import static org.junit.Assert.assertEquals;
import org.junit.Test;
@RunWith(BlockJUnit4ClassRunner.class)
public class CalculatorTest {
@Test
public void evaluatesExpression() {
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
}
}
可以看到除了 @RunWith(BlockJUnit4ClassRunner.class)
和 @Test
注解,其余实现和普通 Java 方法一致。
运行方式也很简单。如果使用的 Android Studio 的话,只需在 evaluatesExpression
方法上点击右键,会弹出如下弹窗,然后点击 "Run 'evaluatesExpression'",即可运行。
下面将分析 evaluatesExpression
方法是如何被调起的。
大体上分三步:
1.查找并创建执行主体(Runner)
2.找到具有 @Test
注解的单测方法
3.运行单测方法
1.查找执行主体(Runner)
执行主体为实现了 Runner
接口的对象。Runner
接口的核心方法为 run
方法,其中一个重要的子类为 ParentRunner
。
查找 Runner
对象的核心代码在 AllDefaultPossibilitiesBuilder
类里,下面采用伪代码描述执行流程:
// testClass = CalculatorTest.Class
public Runner runnerForClass(Class<?> testClass) throws Throwable {
if CalculatorTest 存在 @RunWith 注解
根据注解内容创建 Runner(本例中即为 BlockJUnit4ClassRunner)
else
创建 BlockJUnit4ClassRunner
}
BlockJUnit4ClassRunner
属于 ParentRunner
的子类。
2.找到具有 @Test
注解的方法
第一步创建 Runner
对象时,在构造方法里会传入 CalculatorTest.Class
,然后利用反射,查找标记有 @Test
注解的方法,并将这些方法保存起来。
protected