Android 单元测试之PowerMock

其次,在测试类需要使用到 @PrepareForTest()注解,来达到Mock final、构造函数、static、私有方法所在的类的目的。

该注解即可写在方法上,也可以以全局的方式写在类上。

下面的例子都借鉴于:PowerMock框架讲解及使用

2.1 Mock普通方法


普通的mock就等于Mokito的用法一样。

来看看下面这个类:

class PowerMockClass {

public fun isFileExists(file: File): Boolean {

return file.exists()

}

}

建立测试类:

class PowerMockClassTest {

@Test

fun isFileExists() {

// Mock 一个 File对象

val file = PowerMockito.mock(File::class.java)

// 创建当前类

val powerMockitoClass = PowerMockClass()

// 当Mock对象被调用了 exists() 方法,则返回False

PowerMockito.when(file.exists()).thenReturn(false)

// 进行断言

assertFalse(file.exists())

}

}

对于这种Mock普通对象进行测试来说,不需要使用 @RunWith还有 @PrepareForTest()

2.2 Mock 静态方法


我们创建一个 static的方法:

object PowerMockClass {

@JvmStatic

public fun isFileExists(): Boolean {

return false

}

}

创建测试类,需要使用 mockStatic(),里面装入的是我们要测试静态方法所在的类,测试类如下:

@RunWith(PowerMockRunner::class)

@PrepareForTest(PowerMockClass::class)

class PowerMockClassTest {

@Test

fun isFileExists() {

// mockStatic 来Mock静态方法所在的类

PowerMockito.mockStatic(PowerMockClass::class.java)

// 当Mock对象被调用了 exists() 方法,则返回True

PowerMockito.when(PowerMockClass.isFileExists()).thenReturn(true)

// 进行断言

assertTrue(PowerMockClass.isFileExists())

}

}

注意:

  • 方法需要被 @JvmStaic修饰,这是因为伴生方法虽然看似静态,但其在JVM的运作还是使用普通的对象来的,所以需要通过 JvmStaic声明为真正的静态方法。

  • 所在类需要声明为obejct,因为 mockStatic里的类需要是静态的。

2.3 Mock final方法


final方法还是蛮好操作的,没有什么限制,来看看实现类:

class PowerMockClass {

public final fun isFileExists(): Boolean {

return false

}

}

测试类如下:

@RunWith(PowerMockRunner::class)

@PrepareForTest(PowerMockClass::class)

class PowerMockClassTest {

@Test

fun isFileExists() {

// mock 一个 final方法所在的类的对象

val pmc = PowerMockito.mock(PowerMockClass::class.java)

// 当Mock对象被调用了 exists() 方法,则返回True

PowerMockito.when(pmc.isFileExists()).thenReturn(true)

// 进行断言

assertTrue(pmc.isFileExists())

}

}

2.4 Mock private方法


实现类:

class PowerMockClass {

private fun isFileExists(): Boolean {

return false

}

}

测试类比较简单:

@RunWith(PowerMockRunner::class)

@PrepareForTest(PowerMockClass::class)

class PowerMockClassTest {

@Test

fun isFileExists() {

// mock 一个 private方法所在的类的对象

val pmc = PowerMockito.mock(PowerMockClass::class.java)

// 当Mock对象被调用了 exists() 方法,则返回True

PowerMockito.doReturn(true).when(pmc, “isFileExists”)

}

}

可以看到基本和上面基本没差别,但是由于我们不能直接调用 private方法,所以不好做断言,这个时候我们可以加一个包装方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值