MyD*_*Tom 5 java testing unit-testing mockito kotlin
STRICT_STUBS我只找到了三种在 Mockito 中启用的方法(请参阅文档)
MockitoJunitRunner
MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)
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)
STRICT_STUBS 需要额外的逻辑来验证测试后调用的内容和未调用的内容,这就是为什么它在整个测试级别上配置的原因。话虽这么说,这三种方法中的任何一种都应该使用普通Mockito.mock方法(并且在给定的示例中提供它Mockito.mock在幕后使用的情况)。
| 归档时间: |
|
| 查看次数: |
2177 次 |
| 最近记录: |