很多时间,由于某种缘故原由,我们需要检查当我们调用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...