【问题标题】:How could I test a method is not being called for a non mock object?我如何测试没有为非模拟对象调用方法?
【发布时间】:2016-05-05 10:05:41
【问题描述】:

我有一个测试如下,在给定的条件下,我想确保mainPresenter.presenterFunction() 不被调用。

class MainPresenterTest {

    val mainPresenter: MainPresenter
    val mainView: MainView
    val mainBridge: MainBridge

    init {
        mainView = mock(MainView::class.java)
        webBridge = mock(MainBridge::class.java)
        mainPresenter = MainPresenter(mainView, mainBridge)
    }

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
    }

    @Test
    fun simpleTeset1() {
        // Given
        whenMock(mainView.viewFunctionCondition()).thenReturn(true)

        // When
        mainPresenter.onTriggger()

        // Then
        verify(mainView).viewFunction1()
        verify(mainPresenter, never()).presenterFunction()
        verify(mainView, never()).viewFunction2()
    }
}

但它的错误说明

org.mockito.exceptions.misusing.NotAMockException: 
Argument passed to verify() is of type MainPresenter and is not a mock!
Make sure you place the parenthesis correctly!

报错就行了verify(mainPresenter, never()).presenterFunction()

预计mainPresenter 不是模拟对象。如何测试为非模拟对象调用的方法?

我在how to verify a method of a non-mock object is called? 中看到了答案,但它仍在使用 Mock 和 Spy。我希望找到一种无需模拟我已经拥有的类实例的方法。

(注:以上是用Kotlin写的)

【问题讨论】:

  • 正如您链接到的答案所示,spy 旨在解决这个问题 - 让您验证对非模拟对象实例的调用。能解释一下为什么spy不能用吗?
  • 你试图做的事情也是糟糕的类设计的标志。保持内部隐私,并测试外部行为。

标签: android unit-testing mockito kotlin


【解决方案1】:

根据定义,这是行不通的。

模拟框架可以verify 只调用模拟对象。他们无法知道他们无法控制的对象发生了什么或没有发生什么。您要么需要模拟您的演示者,将其替换为存根,要么...

嗯,我认为只有这两个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多