当前位置: 首页 > 知识库问答 >
问题:

Spock:在setup()中定义的交互可以在测试用例中被替换吗?

宰父学
2023-03-14

我很难理解Groovy单元测试中的Spock交互。

public interface Bar {
  public String getMessage();
}

public class Foo {
  private Bar bar;
  public void setBar(Bar bar) {
    this.bar = bar;
  }
  public String getMessage() {
    return bar.getMessage();
  }
}
class FooSpec extends Specification {

  private Bar bar;
  private Foo foo;

  def setup() {
    bar = Mock(Bar) { getMessage() >> "hello" }
    foo = new Foo()
    foo.bar = bar
  }

  def "say hello"() {
    expect:
    foo.message.equals("hello")
  }

  def "say goodbye"() {
    setup:
    bar.getMessage() >> "goodbye"

    expect:
    foo.message.equals("goodbye")
  }
}

第二个测试尝试修改barmock,使其为getMessage方法返回goodbye。然后,我们期望foo.getMessage()(它委托给bar.getMessage())返回goodbye。但是,测试失败如下:

Foospec:说再见:不满足26个条件

因为foo.message仍然等于hello

def "say goodbye"() {
  when:
  bar.getMessage() >> "goodbye"

  then:
  foo.message.equals("goodbye")
}
def "say goodbye"() {
  when:
  no_op()

  then:
  bar.getMessage() >> "goodbye"
  foo.message.equals("goodbye")
}

我可能仍然在Mockito模式下思考,并假设交互等效于when(...).thenreturn(...)表达式,以后的交互将覆盖以前的交互。

是否有一种简单的方法使用Spock在setup方法中声明交互,然后在测试用例中重写该交互?还是需要删除setup()方法,并基本上为每个测试用例添加setup:块?

共有1个答案

蒋航
2023-03-14

这是个棘手的问题。如文档中所述,在then-block中声明的交互优先于前面声明的交互。但是,在then-block中声明的交互作用域为上一个when-block。(这允许有多个when-then对。)因此,您的最后一次尝试不起作用,但下面的尝试将起作用:

def setup() {
    bar.message >> "hello"
}

def "say goodbye"() {
    when:
    def msg = foo.message

    then:
    bar.message >> "goodbye"
    msg == "goodbye"
}

我同意在测试方法中声明的交互总是重写在设置方法中声明的交互是很好的。无论如何,重写交互的一个好的替代方法是每个测试方法调用一个帮助器方法,该方法为该测试方法设置预期的交互。

 类似资料:
  • 我有一个小型的spring boot 2.2批处理,它编写了一个OAuth2 REST API。 我已经能够按照https://medium.com/@asce4s/oauth2-with--webclient-761d16f89cdd配置并且它能够正常工作。 但是,现在我想为我的批处理编写一个集成测试,我想避免使用“真正的”授权服务器来获得一个令牌:如果一个外部服务器宕机,我不希望我的测试失败。

  • 斯波克规格 如何测试从“Specification下的方法(teamservices.deleteteam())”调用的“Specification下的类”teamservices.moveAssets())方法? https://github.com/spockframework/spock/discussions/1346

  • 我在开始使用spock测试java代码时遇到了一个问题。运行测试时出现错误: 我使用Intellij和Maven,将依赖项放入pom文件: 创建了我的简单类:(在java中) 和测试(它是spock类): 我的项目树如下所示: 我试着跟随一些教程,但可能我错过了一些东西。我的项目有什么问题,为什么测试不起作用?

  • 问题内容: 请考虑以下情形。我有一个带有bean的Spring应用程序上下文,该bean的属性应该是可配置的,认为或。可变的应用程序配置由单独的Bean管理,我们称之为。 管理员现在可以更改配置值,例如电子邮件地址或数据库URL,我想在运行时重新初始化配置的bean。 假设我不能只是简单地修改上述可配置bean的属性(例如,通过或构造函数注入创建),而必须重新创建bean本身。 关于如何实现这一点

  • 我以为我已经理解了斯波克的交互,但我必须管理,我仍然错过了一些部分的图片。 好了,这里是我的问题:我在Grails服务中有一个方法,它执行一些操作,包括调用同一个服务类的void方法。代码如下: 你觉得呢?怎么了? 一如既往,提前感谢。