Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用Mockito.mock()时启用严格的_存根_Java_Unit Testing_Testing_Kotlin_Mockito - Fatal编程技术网

Java 如何在使用Mockito.mock()时启用严格的_存根

Java 如何在使用Mockito.mock()时启用严格的_存根,java,unit-testing,testing,kotlin,mockito,Java,Unit Testing,Testing,Kotlin,Mockito,我发现只有三种方法可以在Mockito()中启用严格的存根 MockitoJunitRunner MockitoJUnit.rule().strictness(strictness.STRICT\u STUBS) Mockito.mockitoSession() .initMocks(本) .严格性(严格性、严格性) .startLocking() 它们都需要通过注释来声明存根(@Mock-lateinit-var-api:MyApi)。但我使用和声明的存根是这样的: val api:MyApi

我发现只有三种方法可以在Mockito()中启用
严格的存根

  • MockitoJunitRunner

  • MockitoJUnit.rule().strictness(strictness.STRICT\u STUBS)

  • Mockito.mockitoSession()
    .initMocks(本)
    .严格性(严格性、严格性)
    .startLocking()

  • 它们都需要通过注释来声明存根(
    @Mock-lateinit-var-api:MyApi
    )。但我使用和声明的存根是这样的:

    val api:MyApi = mock{
      on { call("expected-param") } doReturn something
    }
    
    val-api:MyApi=mock()

    或者像这样:

    val api:MyApi = mock{
      on { call("expected-param") } doReturn something
    }
    
    在引擎盖下,它使用的方法

    问题1:使用时如何启用
    STRICT_STUBS

    问题2:无论mock是如何定义的,也许可以为所有内容启用
    严格的存根

    更新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)替换它时,
    strict stubing不再起作用

    更新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_存根需要额外的逻辑来验证在测试之后调用了什么和没有调用什么,这就是为什么它在整个测试级别上配置的原因。
    这就是说,这三种方法中的任何一种都应该适用于普通的
    Mockito.mock
    方法(并且在给定的示例中,它在引擎盖下使用
    Mockito.mock
    )。

    是的,严格的存根适用于整个测试级别。我想,这就是为什么
    Mockito.mock
    不起作用的原因。因为每个模拟都是“单独”创建的。我用测试示例更新了这个问题,以显示我是如何看到它不起作用的。在进一步的实验之后,我发现
    Mockit.mock
    setUp
    方法中调用时起作用。基本上,这意味着我不应该在设置严格模式之前创建模拟。