Spock - 交互测试后测试失败

时间:2015-09-24 16:08:01

标签: spock

此测试仅在测试条件时有效。当与交互测试混合时,它会失败。

class Test extends Specification {

   class Inner {
      public String greet() {
         return "hello"
      }
   }

   def "simple test"() {

      given:
         def inner = Mock(Inner)
         inner.greet() >> { "hi" }
      when:
         def msg = inner.greet()
      then:
         1 * inner.greet() // Below will pass when this line commented out.
         msg == "hi"
   }
}

当删除交互测试时,测试将通过。

Condition not satisfied:

msg == "hi"
|   |
|   false
null

2 个答案:

答案 0 :(得分:1)

让我们谈谈发生了什么。 (或者,如果您不想,请阅读“Scope of Interactions”部分。)

正在发生的是范围界定问题。你可能知道,你可以有多个连续的/然后对;在then块中完成的任何Mocking实际上只限于它的块时。如果Mocked方法已在when / then范围之外定义,会发生什么?在then块中定义的模拟优先。

恭喜!您偶然发现了方式来覆盖已建立的Mocked值/方法。在新文档发布之前,我花了很长时间弄清楚它是如何工作的。

因此我们知道您正在覆盖定义要返回的值的模拟器。我们如何从这里开始?

given:
    def inner = Mock(Inner)
    1 * inner.greet() >> message 
expect:
    "hi" = inner.greet()
where:
    message = "hi"

分手思考......我希望你没有测试你在测试中设置的值。这有效地断言1 == 1.如果你想在测试行为时测试你的实际代码我建议使用间谍

given:
    def inner = Spy(Inner)
    1 * inner.greet() >> { 
        callRealMethod() // Actual method, read the documentation I linked
    }
expect:
    "hi" = inner.greet()

答案 1 :(得分:0)

应该是:

@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
@Grab('cglib:cglib-nodep:3.1')

import spock.lang.*

class Test extends Specification {

    class Inner {
        public String greet() {
            return "hello"
        }
    }

    def "simple test"() {
        given:
            def inner = Mock(Inner)
        when:
            def msg = inner.greet()
        then:
            1 * inner.greet() >> "hi"
            msg == "hi"
    }
}