Я нашел только три способа включения 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
}
Под капотом используется метод 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)
, строгая заглушка больше не работает.
Обновление 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)
}
}