我只发现了三种在Mockito中启用STRICT_STUBS的方法(见文献)
MockitoJunitRunnerMockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)Mockito.mockitoSession() .initMocks(this) .strictness(Strictness.STRICT_STUBS) .startMocking()所有这些都需要通过注释(@Mock lateinit var api: MyApi )来声明存根。但是我使用莫奇托-科特林并像这样声明存根:
val api: MyApi = mock()
或者像这样:
val api:MyApi = mock{
on { call("expected-param") } doReturn something
}在遮罩下,它使用Mockit.mock方法。
问题1:当我使用Mockit.mock时如何启用STRICT_STUBS?
问题2:也许可以为所有东西启用STRICT_STUBS,而不管如何定义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)代替它时,严格的固执不再起作用了。
更新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)
}
}发布于 2018-10-20 22:06:08
STRICT_STUBS需要额外的逻辑来验证测试后已经调用和未调用的内容,这就是为什么在整个测试级别上对其进行配置的原因。尽管如此,这三种方法中的任何一种都应该使用普通的Mockito.mock方法(并给出示例,只要它在幕后使用Mockito.mock )。
https://stackoverflow.com/questions/52345881
复制相似问题