簡體   English   中英

如何在使用Mockito.mock()時啟用STRICT_STUBS

[英]How to enable STRICT_STUBS while using Mockito.mock()

我只發現了三種在Mockito中啟用STRICT_STUBS的方法( 請參閱documemantation

  1. MockitoJunitRunner

  2. MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)

  3. Mockito.mockitoSession() .initMocks(this) .strictness(Strictness.STRICT_STUBS) .startMocking()

它們都需要通過注釋聲明存根( @Mock lateinit var api: MyApi )。 但是我正在使用mockito-kotlin並像這樣聲明存根:

val api: MyApi = mock()

或類似的:

val api:MyApi = mock{
  on { call("expected-param") } doReturn something
}

它在后台使用Mockit.mock方法。

問題1:我怎樣才能使STRICT_STUBS當我使用Mockit.mock

問題2 :也許可以對所有內容啟用STRICT_STUBS ,而無論模擬的定義方式如何?

更新1 測試例

interface Foo {
    fun doFoo(value: String): String
}

class Boo(private val foo: Foo) {
    fun doBoo(value: String): String {
        return foo.doFoo("$value with Boo")
    }
}

class ExampleTest {
    @get:Rule val rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)
    // doesn't work when replaced with var mockedFoo: Foo = Mockito.mock(Foo::class.java)
    @Mock lateinit var mockedFoo: Foo
    lateinit var booUnderTest: Boo

    @Before fun setUp() {
        booUnderTest = Boo(mockedFoo)
    }

    @Test fun withEmptyString() {
        `when`(mockedFoo.doFoo(" with Boo")).thenReturn("empty boo")
        // should fail, because this interaction is not used
        `when`(mockedFoo.doFoo("Foo with Boo")).thenReturn("complete")
        booUnderTest.doBoo("")
        verifyNoMoreInteractions(mockedFoo)
    }

    @Test fun withRealString() {
        `when`(mockedFoo.doFoo("Foo with Boo")).thenReturn("complete")
        booUnderTest.doBoo("Foo")
        // this test should pass because with STRICT stubbing no need to call verify
        verifyNoMoreInteractions(mockedFoo)
    }
}

當存根定義為@Mock lateinit var mockedFoo: Foo時,嚴格存根有效。 當我用var mockedFoo: Foo = Mockito.mock(Foo::class.java)替換它時var mockedFoo: Foo = Mockito.mock(Foo::class.java)不再存在嚴格的存根。

更新2.答案。 如果啟用了嚴格模式,則調用Mockito.mock

class ExampleTest {
    @get:Rule val rule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)
    lateinit var mockedFoo: Foo
    lateinit var booUnderTest: Boo
    @Before fun setUp() {
        mockedFoo = Mockito.mock(Foo::class.java)
        booUnderTest = Boo(mockedFoo)
    }

    @Test fun withEmptyString() {
        `when`(mockedFoo.doFoo(" with Boo")).thenReturn("empty boo")
        // should fail, because this interaction is not used
        `when`(mockedFoo.doFoo("Foo with Boo")).thenReturn("complete")
        booUnderTest.doBoo("")
        verifyNoMoreInteractions(mockedFoo)
    }

    @Test fun withRealString() {
        `when`(mockedFoo.doFoo("Foo with Boo")).thenReturn("complete")
        booUnderTest.doBoo("Foo")
        // this test should pass because with STRICT stubbing no need to call verify
        verifyNoMoreInteractions(mockedFoo)
    }
}

STRICT_STUBS需要額外的邏輯來驗證測試后已調用和未調用的內容,這就是為什么在整個測試級別上對其進行配置的原因。 話雖這么說,這三種方式中的任何一種都應與普通的Mockito.mock方法一起使用(並在給定的示例中提供了在Mockito.mock使用Mockito.mock的方式)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM