你应该知道的android单元测试

安卓单元测试全攻略 安卓单元测试,只看这一篇就足够啦。真正的完全解析,真正的从0到1,Junit结合Mockito与Robolectric实现从M层到V层,Jacoco扫描函数、逻辑、代码行数单元测试覆盖率100%的全面测试。你是否还在为了验证联网与未联网状态而频繁的开关WiFi开关?或者你是否还在为一个switch判断而频繁的使用debug断点setValue来观测代码的逻辑判断情况?又或者你是否还在为了校验某个UI 阅读详情

介绍

  • setup:即new 出待测试的类,设置一些前提条件

  • 执行动作:即调用被测类的被测方法,并获取返回结果

  • 验证结果:验证获取的结果跟预期的结果是一样的

Junit4

java测试框架

testCompile ‘junit:junit:4.12’
@Before
@Test
(expected = IllegalArgumentException.class) 验证是否抛该异常
@After
@Ignore 跑所有测试方法忽略该方法

除了在AndroidStudio里面运行,你还可以在命令行通过gradle testDebugUnitTest,或者是gradle testReleaseUnitTest,分别运行debug和release版本的unit testing

Mockito的

  • java界使用最广法的mock框架
    概念就是创建一个类的虚假对象,在测试环境中,用来替换掉真实的

  • 添加依赖

repositories { jcenter() }
dependencies {
      testCompile "org.mockito:mockito-core:
}
  • api

    1. 验证方法调用:
      Mockito.verify(objectToVerify,Mockito.times(3)).methodToVerify(Mockito.anyString());

    2. 设定返回值,方便测试:
      Mockito.when(mockObject.targetMethod(args)).thenReturn(desiredReturnValue);

    3. 执行特定动作,如访问网络数据
    Mockito.doAnswer(desiredAnswer).when(mockObject).targetMethod(args);
    Mockito.doAnswer(new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        //这里可以获得传给performLogin的参数
        Object[] arguments = invocation.
        //callback是第三个参数
        NetworkCallback callback = (NetworkCallback) arguments[
    
        callback.onFailure(500, "Server error");
         return 500;
        }
    }).when(mockUserManager).performLogin(anyString(), anyString(), any(NetworkCallback.class));

    ps: Mockito.spy与mock的唯一区别就是默认行为不一样:spy对象的方法默认调用真实的逻辑,mock对象的方法默认什么都不做,或直接返回默认值。

dagger2

能不用就不用!
- 依赖

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        //添加apt插件
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

...
```
//应用apt插件
apply plugin: 'com.neenbedankt.android-apt'

...

dependencies {
    ...
    //引入dagger2
    compile 'com.google.dagger:dagger:2.4'
    apt 'com.google.dagger:dagger-compiler:2.4'
    //java注解
    provided 'org.glassfish:javax.annotation:10.0-b28'
}
``````
  • 依赖注入概念
    我们平常使用的构造函数,需要传入对象去使用,就算是一种依赖注入,然而当我们需要的对象嵌套越来越多的时候,就会显得冗余,这个时候dagger2就出现了。

    client –> Component(工厂管理员)–>Module(生产依赖的工厂)–>Dependency

  • api

    Module 
           @Module 修饰类
           @Provides 修饰方法
           @Singleton 修饰方法,获取单例节省资源
    Component
          @Component
                (modules={OneModule.class})  修饰类,指定管理的生产Dependency的工厂
          1. 定义返回Dependency的抽象方法即可
          2. 先在Component 定义inject(Object obj方法
             定义成员变量@Inject修饰即可
          ps: 不能继承,都要实现inject(this)方法才能生成实例
    
  • 单元测试

//需要测试
public class LoginActivity extends AppCompatActivity {
    @Inject
    LoginPresenter mLoginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ComponentHolder.getAppComponent().inject(this);

        findViewById(R.id.login).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = ((EditText) findViewById(R.id.username)).getText().toString();
                String password = ((EditText) findViewById(R.id.password)).getText().toString();

                mLoginPresenter.login(username, password);
            }
        });
    }
}
//测试
public class DaggerUtils {
   public static final AppModule appModule = spy(new AppModule(RuntimeEnvironment.application));

   public static void setupDagger() {
       AppComponent appComponent = DaggerAppComponent.builder().appModule(appModule).build();
       ComponentHolder.setAppComponent(appComponent);
   }
}
//-------
@RunWith(RobolectricGradleTestRunner.class) //Robolectric相关,看不懂的话忽略
@Config(constants = BuildConfig.class, sdk = 21) //同上
public class LoginActivityTest {

    @Test
    public void testActivityStart() {
        @Test
        public void testActivityStart() {
            DaggerUtils.setupDagger();

            LoginPresenter mockLoginPresenter = mock(LoginPresenter.class);  
            Mockito.when(DaggerUtils.appModule.provideLoginPresenter(any(UserManager.class), any(PasswordValidator.class))).thenReturn(mockLoginPresenter);  

            LoginActivity loginActivity = Robolectric.setupActivity(LoginActivity.class);
            ((EditText) loginActivity.findViewById(R.id.username)).setText("xiaochuang");
            ((EditText) loginActivity.findViewById(R.id.password)).setText("xiaochuang is handsome");
            loginActivity.findViewById(R.id.login).performClick();    
            verify(mockLoginPresenter).login("xiaochuang", "xiaochuang is handsome");  //pass!
        }
    }
}

Robolectric使用

Robolectric就是一个能够让我们在JVM上跑测试时够调用安卓的类的框架
- android.jar不完整,android相关方法只是抛出异常RuntimeException(“stub!!”)
- 依赖

testCompile 'junit:junit:4.12'
testCompile "org.robolectric:robolectric:3.2.1"

- api

```
@RunWith(RobolectricGradleTestRunner.class)  
@Config(constants = BuildConfig.class, sdk = 21)  
public class MainActivityTest {  
    @Test  
    public void testMainActivity() {  
        MainActivity mainActivity = Robolectric.setupActivity(MainActivity.class);  
        mainActivity.findViewById(R.id.textView1).performClick();  

        Intent expectedIntent = new Intent(mainActivity, SecondActivity.class);  
        ShadowActivity shadowActivity = Shadows.shadowOf(mainActivity);  
        Intent actualIntent = shadowActivity.getNextStartedActivity();  
        Assert.assertEquals(expectedIntent, actualIntent);  
    }  
}  
```
Android 自带的 gradle task 具体说明 因为在构建android项目时,在project级别的build.gradle里面配置了该句话: pendencies { classpath 'com.android.tools.build:gradle:3.0.1' } 所以,gradle会给我们插入许多适用于Android的gradle task,我们可以点击IDE,右边的Gradle图标查看: 以下提供了这些官... 阅读详情

相关推荐

Android Studio系列-Activity单元测试

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

2401_84149505的博客 1172

使用gradlew test进行单元测试【Android】

在模块下的build.gradle中进行相关配置

哈哈哈 1736

Android单元测试:全面了解与实践

Android提供了多种单元测试框架和工具,如JUnit和AndroidJUnit,可用于编写和运行单元测试。最后,我们探讨了一些单元测试的实践,如命名约定、边界条件测试、持续集成和自动化测试以及断言的使用。在Android开发中,单元测试是一项至关重要的实践,它可以帮助开发者验证代码的正确性、提高代码质量,并提供一定的保障,以确保应用程序的稳定性和可靠性。本文将深入探讨Android单元测试的概念、原则和最佳实践,并提供一些示例代码来帮助读者更好地理解和应用单元测试。四、编写可测试的代码。

BgScratch的博客 146

AndroidStudio Gradle只有testDebugUnitTest

如图打勾。

620

解决PubMed卡在“正在检查浏览器”页面的完整排查指南

DNS解析是将域名转换为IP地址的基础网络服务,其稳定性和准确性直接影响网站访问。当DNS服务器响应缓慢或返回异常结果时,可能导致客户端与服务器建立连接时出现偏差,从而触发网站的安全验证机制,例如Cloudflare等安全服务提供的浏览器环境检查。这一机制旨在防御恶意流量,但偶尔也会误拦截正常访问。在生物医学信息检索领域,PubMed作为核心文献数据库,其稳定访问对科研工作流至关重要。针对因DNS或本地缓存问题导致的‘正在检查浏览器’页面卡顿,通过刷新DNS缓存、更换为Google Public DNS或C

weixin_29597551的博客 3566

数字麦克风PDM信号采集与STM32 I2S接口应用(二)

在使用STM32的数字麦克风I2S接口时,计算采样率让人头疼,芯片手册上没有明确的说法,而手册上的计算方法经过测试却和实验不符。借助搜索引擎,大部分资料都是来自于开发板卖家或开发板论坛,主要是咪头采集然后配置WM89系列解码芯片,然后配合FatFS、MP3解码等模式,主要是讲解I2S录音、存储、放音等。外文资料得到的也寥寥无几,也没有找到讲解STM32数字麦克风配置、计算的文档。加上网上资料转载、抄袭、浅尝辄止的笔记教程,这些更是让检索大海捞针,过程艰辛一言难尽,有些网文三言两语抑或作者都没有搞清楚随手一写

XIAOYOUDUODUO的博客 6054

Android 单元测试之JUnit

在记录单元测试有关的笔记前,先谈谈为什么写单元测试 看完这篇文章,相比对单元测试有了一定了解。那么单元测试如何开始呢 一.创建测试类 在任意需要测试的类(或者方法)下面按下Ctrl+Shift+T(这是默认热键)如下图** 首次创建一个新的测试类,然后会弹出提示界面: 如果你已经创建过,则会提示对应的测试类让你跳转过去,同样测试类也可以利用这个方法跳转到被测试类。 创建...

Android SVG之pathData 455

抖音短视频数据抓取实战系列(一)——模拟器性能对比与优化配置

本文是抖音短视频数据抓取实战系列的开篇,重点探讨了模拟器选型与优化配置。通过对比雷电、夜神、逍遥三大主流模拟器在性能、抖音兼容性及抓包友好度上的表现,文章指出雷电模拟器因其稳定的桥接网络模式和良好的兼容性,是数据抓取的优选。并提供了雷电模拟器从安装、网络桥接到系统优化的详细配置指南,旨在帮助读者构建稳定高效的抓取环境。

weixin_29230901的博客 246

解决AndroidStudio Gradle只有testDebugUnitTest

2:取消勾选Configure all Gradle tasks during Gradle Sync...大功告成,现在去看看Gradle,屏蔽的都显示出来了。1:点击Task list not built...

1994

[deprecated]第九章:SVM机制: 9-2 Linux HMM原理与实现详解

Linux内核HMM(异构内存管理)子系统为异构计算平台提供统一内存管理机制,支持CPU与GPU等设备共享虚拟地址空间,实现零拷贝数据访问。其核心功能包括:1)统一虚拟地址空间,设备可直接访问CPU进程内存;2)实时页表同步与失效通知,确保地址空间一致性;3)支持设备端page fault处理;4)管理多种内存类型(系统内存、设备私有内存等)。HMM通过mmu_interval_notifier机制感知地址空间变化,提供标准API简化驱动开发,显著提升异构计算性能和数据传输效率。

图形/计算GPU的驱动与虚拟化技术分享园地 2539

数据分享|2023年OSM道路数据(全国,分省,分市)

首先这个工作非常有必要的,因为我们正常使用的道路的分类都是基于包括城市快速路、城市主干路、城市次干路这个体系的,大家对于这个分类体系应该更熟悉,但是OSM地图的道路分类又不是完全按这个来的,所以非常有必要重新分类;搞清楚道路类型是我们使用道路数据做很多工作的基础,比如我们在使用道路数据的时候,经常需要预估道路的行车速度,而这个速度一般就是根据道路类型来的,比如高架路的车速肯定就比城市支路快很多!下载分为两种情况,第一种是下载小区域的数据,比如下载一个街区的数据,第二种为下载整个中国范围的。

JData_Engineer的博客 4305

android 蘑菇街开源,我知道你觉得写单元测试很麻烦,所以,蘑菇街开源了一个安卓单元测试框架...

我知道你觉得写单元测试很麻烦,所以。。。我们开源了一个单元测试框架,里面提供了一系列的utility,希望能帮助你更快更轻松的写单元测试,能够少写一点boilerplate code,少一点痛苦,多一点愉悦!地址在这里:https://github.com/mogujie/natasha这个project是怎么来的?蘑菇街目前采用组件化的开发方式,一个app由很多个模块组成,每个模块都有单元测试的...

weixin_35881620的博客 242

使用 MATLAB/Simulink 搭建一个 无人机群间数据交换与协同控制仿真系统

本文提供了一份详细的Simulink无人机群协同控制仿真教程。主要内容包括:无人机群系统架构设计(去中心化网络、通信分层)、三维运动建模、空-空通信链路实现(距离判断、无线信道)、分布式Consensus控制算法开发,以及性能评估指标设定。教程采用模块化设计思路,通过ModelReference构建多无人机并行模型,并给出了MATLAB函数实现关键算法。最后展示了预期仿真结果(收敛时间<15s、位置偏差<2m)和进阶应用方向(编队飞行、AI协同等),帮助读者掌握群体智能系统的建模与仿真方法。

amy_mhd的博客 155

android gradle 单元测试,安卓:与gradle这个单元测试(Android: unit testing with gradle

我有我可以运行在Android Studio中就好了下面的单元测试,但我试图把它建立持续集成,所以我需要gradle这个才能够运行。package com.smartsocialmedia.tests;import android.test.InstrumentationTestCase;import com.smartsocialmedia.utility.DbConnector;import ...

weixin_29271053的博客 162

2025年最新自动化/控制保研夏令营&预推免面试真题分享(东南/浙大/华科清华)

笔者来2021级本科自动化专业,以下部分将介绍我在夏令营以及预推免期间发生经历和问题。

Control Everything 2645

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE

当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 638

安卓单元测试

CheckoutModel的loadCheckoutData单元测试2:mock Api类,指定当它的get方法在收到某些调用的时候,直接调用传入的callback的onSuccess方法,然后调用CheckoutModel的loadCheckoutData()方法,验证Otto bus的post方法得到了调用,并且参数是对的。当网络请求返回以后,更新用户界面。然而我觉得,除了这方面的作用,单元测试还能在非常大的程度上改善代码的设计,同时还能节约时间,让人工作起来更有信心、更开心,以及其他的一些好处。

qq_54431641的博客 548

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android单元测试全解

  自动化测试麻烦吗?说实在,麻烦!有一定的学习成本。但是,自动化测试能节省时间来打游戏!!

to_perfect的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android单元测试

全面了解Android单元测试

Makenna's World 3083

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【腾讯Bugly干货分享】安卓单元测试:What, Why and How

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d28349101cd07a5404c415Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。本期,我们邀请了蘑菇街 Android 开发工程师——小创,为大家分享《安卓单元测试:What,

腾讯Bugly的专栏 1534

Android 单元测试初体验(二)-断言

当初在学校学安卓的时候,老师敢教学进度,翻到单元测试这一章节的时候提了两句,没有把单元测试当重点讲,只是说我们工作中几乎不会用到,果真在之前的几年工作当中我真的没有用到,工作中都没有写过单元测试,后来我自己也下意识的忽略了这一块,直到听说现在这家公司后面会要求单元测试用例覆盖率达到百分之七十。我开始慌了,单元测试什么的,国内真的不太重视,这不,抽个周末简单学习下。对于安卓的单元测试的话,现在新建一个项目可以看到都是用的Junit4,ps:涉及Compose的单元测试本文不会过多解释。这是官网前一篇。

我怀里的猫的博客 1565

Android单元测试学习之 Junit4

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_84010362的博客 1253

Android:单元测试

前言对于Android的单元测试一直有些弄不明白,虽然要进行单元测试并不复杂,但是其中的关系好像有点复杂,包括怎样在Eclipse进行单元测试,又怎样在Android Studio进行单元测试,怎样进行Local的测试而不需要运行真机或虚拟机,各种TestCase有什么不同,为什么Junit4好像很难work的样子…等等问题,我试着一一弄明白这些问题。这篇文章不涉及UI测试。简介 单元测试是ap

leelit笔记本 1277

android的单元测试,Android 单元测试(Button 点击测试)

android源码中引入了java单元测试的框架(android源码目录:libcore\junit\src\main\java\junit\framework中可见),然后在java单元测试框架的基础上扩展属于android自己的测试框架。android具体框架类的关系图如下: 从上图的类关系图中可以知道,通过android测试类可以实现对android中相关重要的组件进行测试(如Activit...

weixin_35027170的博客 1209

来到 2024,你手上的 Android 项目有单元测试吗?

今天想写一篇文章,讲一讲 Android 开发中的单元测试。 我相信我们大部分同学手上的项目工程目录,点开之后,多少都会都这么两个文件夹,一个 androidTest,一个 test。说实话,我个人以前对 Android 单元测试这块也是知之甚少,然而我敢说,国内大部分公司估计也都不太注重单元测试,换句话说,几乎没多少开发人员会往这两个文件夹里写代码。

公众号【伤心的辣条】资料领取~ 957
上一篇: Rx常用操作符
下一篇: 【cs基础】CPU是怎样执行代码的
JusterBetter
博客等级 码龄11年 11粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值