在spock中调用验证void方法的最佳方法是什么

时间:2020-09-15 19:54:14

标签: unit-testing groovy spock

让我们说我有一个类Foo,其中有两个无效方法barbiz(Object object)

public class Foo {
  public void bar(){}
  public void biz(Object object){}
}

这两个方法都是具有自己的测试用例的复杂方法,但是问题是bar()调用biz(Object object),我想在bar的一个测试用例中对此进行验证。所以我的测试用例是在Spock中设置的。

class FooSpec {
  Foo foo = new Foo()
  
  def "test bar"() {
     given:
       boolean bizCalled = false
       foo.metaClass.biz = {Object object -> bizCalled = true}
     when:
       foo.bar()
     then:
       0 * _
     and:
       bizCalled
  }
}

我从this question得到了这个解决方案,问题是在这个示例中bizCalled始终为假,即使我已经验证biz(Object object)也是{{1} }应该设置为true。

我使用metaClass的方式是否仅仅是出了点问题,还是在spock中有更正确的方法来验证bizCalled在Spock中调用了bar()

1 个答案:

答案 0 :(得分:3)

您忘记将FooSpec扩展为Specification才是真正的Spock测试。如果这样做,则测试通过。这是您稍作调整并重命名的原始测试:

public class Foo {
  public void bar() { biz("dummy"); }
  public void biz(Object object) {}
}
import spock.lang.Specification

class InternalMethodCallTest extends Specification {
  Foo foo = new Foo()

  def "bar calls biz"() {
    given:
    boolean bizCalled = false
    foo.metaClass.biz = { Object object -> bizCalled = true }

    when:
    foo.bar()

    then:
    0 * _

    and:
    bizCalled
  }
}

但这不仅丑陋,而且是“毫无节制的”。 ?我建议您只使用Spy来验证内部方法调用:

import spock.lang.Specification

class InternalMethodCallTest extends Specification {
  Foo foo = Spy()

  def "bar calls biz"() {
    when:
    foo.bar()

    then:
    1 * foo.biz(_)
  }
}
相关问题