利用 Mockk 和 Truth 在 Android 中举行单位测试(II):模拟的高级功能

分享
手机游戏开发者 2024-9-19 08:19:53 39 0 来自 中国
先容

本文表明白利用Mockk和Truth库在 Android 上举行单位测试的更高级的模拟概念。
测试模拟类字段的厘革

很多时间,由于某种缘故原由,我们需要检查当我们调用SUT(被测对象)方法时,其依赖项之一(我们已经模拟)中的某些内容发生了厘革。
让我们看下面的例子:继续类Car和Engine前面的例子(此中每辆车都依赖于一个引擎),我们大概想要验证,当我们启动汽车时,引擎进入“on”状态。
但是,我们没有如许的对象Engine,而是它的模拟对象,因此假如我们实行获取 的值isStarted,我们将在测试中遇到非常。为此,利用了关键字capture:
class CarTest {    lateinit var engine: Engine    lateinit var car: Car    @Before    fun setUp() {        engine = mockk<Engine>()         car = Car (engine)    }    @After    fun tearDown() {        unmockkAll()    }    @Test    fun `Engine turns on when car turns on`() {        val engineStarted = slot<Boolean>()        every { engine.started = capture(engineStarted) } just runs        car.start()        assertThat(engineStarted.captured).isTrue()    }}也就是说,与任何其他模拟方法一样,假如要利用它们,我们现实上需要界说其 setter 的举动。而且通过关键字capture我们可以知道他们在实行该方法后将得到的值。
同样,假如我们只需要让 setter 工作但我们并不特别关心值,我们可以实行以下操纵:
every { engine.started = any() } just runs如许做很告急,由于假如利用了 setter 而我们还没有界说它的举动,测试会抛出非常。
利用静态类和陪同对象举行测试

偶然我们大概需要在代码中利用静态类,比方库Math或非常常见的LogAndroid 类。假如我们的代码利用了一些静态类,我们会看到测试中会抛出一个非常,分析我们没有模拟它的举动。
但是,我们不能调用该函数mockk,由于我们不能实例化一个静态类。那么,我们该怎么做呢?
答案很简朴,我们可以利用mockkStatic:
class CarTest {    @Before    fun setUp() {        mockkStatic(Log::class)        every { Log.d(any(), any()) } just runs    }        @After    fun tearDown() {        unmockkStatic()    }}由于companion objectsKotlin 是静态类的 Java 等价物,我们大概倾向于以为同样的东西实用于它们。然而,static在 Kotlin 中并没有真正存在的概念,虽然它们看起来很像,companion objects但它们也不是静态类,以是这种方法对我们不起作用。
同样,该库为此提供了一个功能,它是mockkObject:
@Beforefun setUp() {    mockkObject(MyCompanionObject.Companion)    every { MyCompanionObject.doSomething() } just runs}通过我们在本系列的上一篇文章和这篇文章中学到的知识,我们现实上知道怎样创建险些任何东西的模拟。在接下来的文章中,我们将利用更复杂的 Kotlin 和 Android 概念测试,比方协程、流、LiveData...
链接:https://cmhernandezdel.hashnode.dev/tests-unitarios-en-android-con-mockk-y-truth-ii-funciones-avanzadas-de-los-mocks
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 11:08, Processed in 0.182827 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表