首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用STRICT_STUBS ()时启用Mockito.mock

如何在使用STRICT_STUBS ()时启用Mockito.mock
EN

Stack Overflow用户
提问于 2018-09-15 14:56:24
回答 1查看 1.7K关注 0票数 4

我只发现了三种在Mockito中启用STRICT_STUBS的方法(见文献)

  1. MockitoJunitRunner
  2. MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS)
  3. Mockito.mockitoSession() .initMocks(this) .strictness(Strictness.STRICT_STUBS) .startMocking()

所有这些都需要通过注释(@Mock lateinit var api: MyApi )来声明存根。但是我使用莫奇托-科特林并像这样声明存根:

val api: MyApi = mock()

或者像这样:

代码语言:javascript
复制
val api:MyApi = mock{
  on { call("expected-param") } doReturn something
}

在遮罩下,它使用Mockit.mock方法。

问题1:当我使用Mockit.mock时如何启用STRICT_STUBS

问题2:也许可以为所有东西启用STRICT_STUBS,而不管如何定义STRICT_STUBS

更新1。测试实例

代码语言:javascript
复制
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,则可以工作。

代码语言:javascript
复制
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)
    }
}
EN

回答 1

Stack Overflow用户

发布于 2018-10-20 22:06:08

STRICT_STUBS需要额外的逻辑来验证测试后已经调用和未调用的内容,这就是为什么在整个测试级别上对其进行配置的原因。尽管如此,这三种方法中的任何一种都应该使用普通的Mockito.mock方法(并给出示例,只要它在幕后使用Mockito.mock )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52345881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档