当前位置: 首页 > news >正文

Android 应用单元测试涉及 Telephony 环境初始化问题

Telephony 相关类注入问题

SubscriptionManager

Cannot invoke "android.telephony.SubscriptionManager.getActiveSubscriptionInfoList()" because "this.mSubscriptionManager" is null
java.lang.NullPointerException: Cannot invoke "android.telephony.SubscriptionManager.getActiveSubscriptionInfoList()" because "this.mSubscriptionManager" is null
    at com.demo.settings.util.SimHotSwapHandler.<init>(SimHotSwapHandler.java:32)

错误初始化方法,因为when不能传入非mock对象,是因为context没有mock初始化

    @Beforepublic void setUp() {// 将mock的SubscriptionManager与测试环境中Context的系统服务绑定when(mockContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)).thenReturn(mockSubscriptionManager);}

正常setup的方法:

import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.shadows.ShadowSubscriptionManager;@RunWith(RobolectricTestRunner.class)
@Config(sdk = {33})
public class Test {@Mockprivate Context mockContext;@Mockprivate SubscriptionManager mockSubscriptionManager;@Mockprivate SubscriptionInfo mockSubscriptionInfo1;@Mockprivate SubscriptionInfo mockSubscriptionInfo2;@Beforepublic void setUp() {MockitoAnnotations.openMocks(this);// 初始化使用Mock的ContextmockContext = mock(Context.class);when(mockContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)).thenReturn(mockSubscriptionManager);}}

 PersistableBundle

Cannot invoke "android.os.PersistableBundle.getBoolean(String)" because "b" is null
java.lang.NullPointerException: Cannot invoke "android.os.PersistableBundle.getBoolean(String)" because "b" is null

Android 环境相关

Context 初始化

在单元测试 setup 过程经常会有处理 context 的值,必要吗?也看到了很多不初始化的案例,是Mockit 已经处理了是吗?但是不初始化也会报资源错误,当设置资源的时候。

Cannot invoke "android.content.Context.getResources()" because "this.mContext" is null
java.lang.NullPointerException: Cannot invoke "android.content.Context.getResources()" because "this.mContext" is null

常见的初始化有几种,有什么差异区别?

  • RuntimeEnvironment
  • ApplicationProvder
  • mock()

以下是使用 RobolectricTestRunner 的一些案例。

案例1、RuntimeEnvironment

局部变量,模拟系统服务

    @Beforepublic void setUp() {Context context = RuntimeEnvironment.application;}
案例2、spy()


http://www.mrgr.cn/news/79041.html

相关文章:

  • 你还没有将 Siri 接入GPT对话功能吗?
  • 服务器与普通电脑有什么区别?
  • yarn install遇到问题处理
  • 【算法刷题指南】优先级队列
  • 高效集成:将聚水潭数据导入MySQL的实战案例
  • 详解QtPDF之 QPdfLink
  • 浏览器的事件循环机制
  • 深入解析 Dubbo 中的常见问题及优化方案: 数据量限制与配置错误20241203
  • 嵌入式系统应用-LVGL的应用-平衡球游戏 part1
  • 三维地形图计算软件(四)-用PYQT5+vtk画任意多面体示例
  • 澎峰科技助力中国移动 重磅发布智算“芯合”算力原生基础软件栈2.0
  • 网络安全-夜神模拟器如何通过虚拟机的Burp Suite代理应用程序接口
  • 3GPP R18 LTM(L1/L2 Triggered Mobility)是什么鬼?(三) RACH-less LTM cell switch
  • PROTEUS资源导引
  • flask的第一个应用
  • 浏览器渲染原理
  • 异常知识及其使用
  • 级联树结构TreeSelect和上级反查
  • mybatis-xml映射文件及mybatis动态sql
  • 嵌入式蓝桥杯学习1 点亮LED
  • 003-SpringBoot整合Pagehelper
  • C++学习笔记
  • springboot vue 会员收银系统 (12)购物车关联服务人员 订单计算提成 开源
  • 2.2 线性表的顺序表示
  • ultralytics-YOLOv11的目标检测解析
  • WPF+LibVLC开发播放器-LibVLC在C#中的使用