一次只嘲笑一个电话

时间:2018-09-14 05:04:01

标签: unit-testing kotlin mockk

我知道,为了模拟方法的响应方式,您必须使用

class PointClassFixed implements Point {
    readonly x: number;
    readonly y: number;

    constructor(x: number, y: number) {
        this.x = x
        this.y = y
    }

    changeCoordinates(x: number, y: number): void {
        this.x = x // error!
        this.y = y // error!
    }
}

我正在尝试模拟一个迭代器,为此您必须模拟2个方法hasNext()和next(),如果hasNext()返回true,则始终会有一个无限循环,如果从头开始返回false, next()将不返回任何内容。

我的问题是:有没有一种方法可以像在ockito中一样用ockock来模拟单个呼叫?我在文档中找不到任何内容。

3 个答案:

答案 0 :(得分:5)

returnsManyandThen构造与/代替return一起使用。

答案 1 :(得分:1)

在出色的帖子Mocking is not rocket science中记录了两种选择:

returnsMany指定一个一个使用的值,即第一个匹配的调用返回第一个元素,第二个返回第二个元素:

    every { mock1.call(5) } returnsMany listOf(1, 2, 3)

您可以使用andThen构造实现相同的目的:

    every { mock1.call(5) } returns 1 andThen 2 andThen 3

答案 2 :(得分:0)

现在我有一个类似的用例,但对我来说answers是合适的解决方案,因为我已经有了Iterator(返回的迭代器实际上是{{1 }}):

Iterator

其中every { mock.bogusIterator() /* : CustomIterator */ } answers { val testIterator = testList.iterator() // just an Iterator every { hasNext() } answers { testIterator.hasNext() } every { next() } answers { testIterator.next() } } 包含测试的一些预定义值。

testList始终返回当时给该函数的值。因此,使用returns将始终在该模拟声明时返回every { hasNext() } returns whatever的值,而不管whatever是否可变。另一方面,使用whatever总是可以得到调用函数时返回的当前值。万一有人对它感到困惑;-)也许我的进一步解释也有些混乱:-)