![](/img/trans.png)
[英]Mockito.mock is not working, using Mockito.when causes NullPointerException
[英]How to enable STRICT_STUBS while using Mockito.mock()
我只發現了三種在Mockito中啟用STRICT_STUBS
的方法( 請參閱documemantation )
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
}
它在后台使用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.