Java 如何在使用Mockito.mock()时启用严格的_存根
我发现只有三种方法可以在Mockito()中启用Java 如何在使用Mockito.mock()时启用严格的_存根,java,unit-testing,testing,kotlin,mockito,Java,Unit Testing,Testing,Kotlin,Mockito,我发现只有三种方法可以在Mockito()中启用严格的存根 MockitoJunitRunner MockitoJUnit.rule().strictness(strictness.STRICT\u STUBS) Mockito.mockitoSession() .initMocks(本) .严格性(严格性、严格性) .startLocking() 它们都需要通过注释来声明存根(@Mock-lateinit-var-api:MyApi)。但我使用和声明的存根是这样的: val api:MyApi
严格的存根
MockitoJunitRunner
MockitoJUnit.rule().strictness(strictness.STRICT\u STUBS)
Mockito.mockitoSession()
.initMocks(本)
.严格性(严格性、严格性)
.startLocking()
它们都需要通过注释来声明存根(@Mock-lateinit-var-api:MyApi
)。但我使用和声明的存根是这样的:
val api:MyApi = mock{
on { call("expected-param") } doReturn something
}
val-api:MyApi=mock()
或者像这样:
val api:MyApi = mock{
on { call("expected-param") } doReturn something
}
在引擎盖下,它使用的方法
问题1:使用时如何启用STRICT_STUBS
问题2:无论mock是如何定义的,也许可以为所有内容启用严格的存根
更新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)替换它时,
strict stubing不再起作用
更新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_存根需要额外的逻辑来验证在测试之后调用了什么和没有调用什么,这就是为什么它在整个测试级别上配置的原因。
这就是说,这三种方法中的任何一种都应该适用于普通的
Mockito.mock
方法(并且在给定的示例中,它在引擎盖下使用Mockito.mock
)。是的,严格的存根适用于整个测试级别。我想,这就是为什么Mockito.mock
不起作用的原因。因为每个模拟都是“单独”创建的。我用测试示例更新了这个问题,以显示我是如何看到它不起作用的。在进一步的实验之后,我发现Mockit.mock
在setUp
方法中调用时起作用。基本上,这意味着我不应该在设置严格模式之前创建模拟。