Как включить STRICT_STUBS при использовании Mockito.mock () - PullRequest
0 голосов
/ 15 сентября 2018

Я нашел только три способа включения STRICT_STUBS в Mockito ( См. Документацию )

  1. MockitoJunitRunner

  2. MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)

  3. 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)
    }
}

1 Ответ

0 голосов
/ 21 октября 2018

STRICT_STUBS нужна дополнительная логика для проверки того, что было, а что не было вызвано после теста, поэтому он достаточно сконфигурирован на уровне всего теста. При этом любой из трех способов должен работать с простым методом Mockito.mock (и с данным примером, если он использует Mockito.mock под капотом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...