【问题标题】:Mockk AssertionError: Verification failed: call 1 of 1Mockk AssertionError:验证失败:调用 1 of 1
【发布时间】:2021-08-10 06:25:25
【问题描述】:

///这是我的课

class State {
    var state: Int = 10
}

open class Car {
    var state:State = State()
    fun changState(data: Int = 1) {
         setState(data)
    }
    fun setState(data: Int = 0) {
        state.state = data
    }
}

/// 这是我的测试

 @Test
    fun `test 1`() {

        var mockCar = mockk<Car>()

        every { mockCar.changState(any()) } just runs
        every { mockCar.setState(any()) } just runs

        mockCar.changState(10)

        verify(exactly = 1) { mockCar.changState(any()) }
        verify { mockCar.setState(any()) }
    }

但它失败并出现此错误

################################

java.lang.AssertionError: Verification failed: call 1 of 1: Car(#1).setState(any())) 没有被调用。

调用相同的模拟:

  1. 汽车(#1).changState(10)

############################

【问题讨论】:

    标签: unit-testing kotlin mockk


    【解决方案1】:

    您需要删除 verify { mockCar.setState(any()) } - 永远不会调用它,因为您嘲笑了

    every { mockCar.changState(any()) } just runs
    

    这意味着存根方法什么也不做,可以这么说是just runs

    我不建议编写只测试模拟的测试,因为当您只使用您认为正确行为的输出时,它会导致代码正常的偏见。相反,为 Car 编写单独的单元测试。

    对于您的用例,mock 不是预期使用的东西,如果您将真实方法调用与模拟行为混合使用,则应该使用 spy。

    【讨论】:

    • 测试的目的是当我们调用 car.changState() 然后 setState() 被调用,它也设置了 cart.state.state 我该怎么做?
    • 我不确定我是否理解目标。除了调用setState 之外,具有单行且无条件的单元函数changState 会做什么?它不需要模拟,因为唯一涉及的其他类是State,imo 也不需要模拟。我只想编写一个测试,在其中调用该方法,比较状态是否从最初的 10 变为其他状态。或者换个角度想:测试模拟有什么用?正如我之前提到的,它只会导致偏见,因为您以您认为正确的方式定义行为,而不是测试实际发生的事情。
    • stackoverflow.com/questions/60148997/… 这是关于这件事的另一个有用的问题 imo
    猜你喜欢
    • 2020-08-15
    • 2016-10-29
    • 1970-01-01
    • 2017-01-03
    • 2016-12-19
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    相关资源
    最近更新 更多