单元测试框架 Robolectric 原理分析

本文介绍了Robolectric——一个基于Junit的Android单元测试框架,它通过mock Android运行时环境使得测试能在JVM上运行。文章首先概述了Junit的基本原理,包括Runner的查找、测试方法的定位和执行。接着,详细探讨了Robolectric的工作机制,涉及类加载器、ASM工具以及如何动态替换Android类的实现。Robolectric通过自定义ClassLoader和使用ASM修改字节码,实现了在不依赖真实Android环境的情况下运行测试。
摘要由CSDN通过智能技术生成

温馨提示:阅读本文前最好简单使用过 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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值