如何在使用 Mockito.mock() 时启用 STRICT_STUBS

MyD*_*Tom 5 java testing unit-testing mockito kotlin

STRICT_STUBS我只找到了三种在 Mockito 中启用的方法(请参阅文档

  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
}
Run Code Online (Sandbox Code Playgroud)

它在底层使用Mockit.mock方法。

问题1STRICT_STUBS :使用Mockit.mock时如何启用?

问题 2STRICT_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)
    }
}
Run Code Online (Sandbox Code Playgroud)

当存根定义为 时,严格存根有效@Mock lateinit var mockedFoo: Foo。当我用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

vin*_*nga 0

STRICT_STUBS 需要额外的逻辑来验证测试后调用的内容和未调用的内容,这就是为什么它在整个测试级别上配置的原因。话虽这么说,这三种方法中的任何一种都应该使用普通Mockito.mock方法(并且在给定的示例中提供它Mockito.mock在幕后使用的情况)。