头图

为你的Android添加第一个单元测试

为你的Android添加第一个单元测试

​ 续上篇《从Kotlin双锁单例中学习到...》,我们为这个加解密单例添加一个单元测试,继续优化我们的代码。从这篇你可以了解到:

  • Android单元测试的添加
  • 单元测试的生命周期
  • 单元测试的Mock对象
  • 断言的使用

Andorid单元测试的添加

testImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

​ 步骤1,这里是使用junit来进行andorid的单元测试,因此在模块的build.gradle下dependencies加入junit依赖包

​ 步骤2方式一:在对应模块-src-test-java下,添加一个kotlin或java的类SecurityHelperTest,我这里是kotlin的语言

​ 步骤2方式二:在需要被测试的类的代码中,右键-Go To-Test,创建单测类SecurityHelperTest

单元测试的生命周期

class SecurityHelperTest{
  @Before
  fun init(){
    println("===@Beforeinitcalled===")
  }
                        
  @After
  fun clearDataForTest(){
    println("===@AfterclearDataForTestcalled===")
  }
  
  @Test
  fun testInstanceOnce(){
    println("ooo@TesttestInstance1calledooo")
  }
  
  @Test
  fun testInstanceTwice(){
    println("ooo@TesttestInstance2calledooo")
  }
  
  @Test
  fun testInstanceThird(){
    println("ooo@TesttestInstance3calledooo")
  }
}

​ 为这个单元测试类SecurityHelperTest首先添加以上代码,我们分别使用@Before/@After/@Test三种注解到类的方法上,每个方法都会打印出不同的日志内容,最后运行这个测试代码。

​ 看到测试结果,3个@Test的方式依次调用,每次调用前都会执行@Before,调用后都会执行@After。知道这个生命周期之后,就可以在@Before放入公共初始化的内容,在@After放入公共销毁的内容。

单元测试的Mock对象

var mSecurityHelper: SecurityHelper = SecurityHelper.getInstance(context)

​ 由于junit是用于进行java的单元测试,而android当中有时候需要操作到android库当中的类(如我的加解密类当中的Context),这时候junit就无法测试了,因此我们需要mock制造一个假的上下文Context,给到这个方法作为输入的参数使用。

testImplementation 'org.mockito:mockito-core:2.19.0'

​ 这里采用了Mockito作为单元测试的Mock使用,在build.gradle下dependencies加入Mockito依赖包。

@RunWith(MockitoJUnitRunner::class)class 
SecurityHelperTest {    
  ...    
  context = mock(Context::class.java)
}

​ 回到我们的单元测试类SecurityHelperTest,在类开头上方加入注解@RunWith(MockitoJunitRunner::class),这个时候就通过mock(Context::class.java)的方法mock出来一个假的上下文context使用(其他android库的对象同理)。

断言的使用

junit中是通过assert类来实现断言,判断这个测试结果是否符合预期。以下列出了一些常用方法(更多详细可查询assert类):

assertEquals检查两个变量值是否相等
assertNotNull检查对象是否不为空
assertSame检查两个对象是否相同
assertTrue检查条件为真
@RunWith(MockitoJUnitRunner::class)
class SecurityHelperTest {
    companion object {
      lateinit var context: Context        
      lateinit var mSecurityHelper1: SecurityHelper        
      lateinit var mSecurityHelper2: SecurityHelper        
      lateinit var mSecurityHelper3: SecurityHelper
    }

    @Before
    fun init() {
      println("===@Before init called===") 
      context = mock (Context::class.java) 
      mSecurityHelper1 = SecurityHelper.getInstance(context)
      mSecurityHelper2 = SecurityHelper.getInstance (context)
      mSecurityHelper3 = SecurityHelper.getInstance (context)
    }

    @Test
    fun testInstanceOnce() {
       println("ooo@Test testInstance1 calledooo") 
      assertNotNull (mSecurityHelper1)
    }

    @Test
    fun testInstanceTwice() {
      println("ooo@Test testInstance2 calledooo") 
      assertSame (mSecurityHelper1, mSecurityHelper2)
    }

    @Test
    fun testInstanceThird() {
      println("ooo@Test testInstance3 calledooo") 
      assertEquals (mSecurityHelper3.javaClass.name, mSecurityHelper2.javaClass.name)
    }

    @After
    fun clearDataForTest() {
        println("===@After clearDataForTest called===")
    }
}

​ 这里是SecurityHelperTest的完整代码,我们分别使用一遍assertNotNull/assertSame/assertEquals三个断言方法,用于测试这个加解密单例代码,第一次调用是否不为空,第二次调用是否同一个实例对象,第三次调用是否实例的类名字相等。

最后运行这个单元测试

​ 以上全部就为我们这个加解密类加入了一个单元测试的过程了,最后我们运行一遍这个单元测试,通过,没有问题哦~


作者联系方式:

关于我

1 声望
0 粉丝
0 条评论
推荐阅读
快速地为项目选择开源许可
开源许可协议是指开源社区为了维护作者和贡献者的合法权利,保证软件不被一些商业机构或个人窃取,影响软件的发展而开发的协议。版权拥有人可以明确定义,其他用户可以免费地使用、修改、共享其版权软件。

已注销阅读 1.3k

如何用3D流体实现逼真水流效果?
华为应用市场在2022年HDC大会期间发布了一款3D水流主题,基于华为HMS Core Scene Kit服务能力,展现立体灵动的水流岛屿,可跟随用户指尖实现实时流体波动效果,既趣味又解压。

HMSCore1阅读 2.1k

前端精准测试实践
随着前端技术发展,已经转变为数据绑定为主流的框架方式,与后端服务一样,前端代码实现也会涉及相互依赖,引用这些场景,那么应该如何准确的评估前端代码改动的影响范围?依赖开发评估?依靠经验评估?或者直接...

京东云开发者3阅读 386

封面图
一文教会你mock(Mockito和PowerMock双剑合璧)
Mock有模仿、伪造的含义。Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。mock工具使用范畴:

京东云开发者2阅读 402评论 1

封面图
安卓逆向之破解某成人APP播放次数限制
某成人水果APP非VIP用户存在播放次数限制,每天只能播放3次。超过3次需要购买VIP。 由于过于贫穷,于是抽空,对其安卓APP进行了逆向分析,最终成功破解了其播放次数限制。

悖论2阅读 383

封面图
Android桌面图标快捷方式
长按桌面图标实现快捷方式最早是iOS提供的功能,而Android最早在Android 7.1版本也提供了对这方面的支持,于是在短时间内,像微信,支付宝,头条等流量级应用都提供了这方面的支持,如下图。 

xiangzhihong3阅读 611评论 2

2022 年终总结|致敬即将过去的,匆忙而又虐心的一年...
本文参与了 SegmentFault 思否年度征文「一名技术人的 2022」,欢迎正在阅读的你也加入。 时间,总是过的这么快,快得让人猝不及防,眨眼又是一年的末...似乎儿时的文章中,对于时间的流逝,描述的最多的便是:白...

贺biubiu1阅读 1.1k

封面图
1 声望
0 粉丝
宣传栏