如何使用groovy在多个黄瓜步骤定义文件中共享变量

时间:2013-11-20 15:25:36

标签: groovy cucumber-jvm

我使用黄瓜jvm用groovy编写测试。到目前为止,我已将所有步骤定义放在一个文件中,并且一切都运行良好。我现在希望将步骤定义移动到单独的文件,因为我有很多。 我遇到的问题是实例变量。我试图使我的步骤定义尽可能通用,因此任何使用@when注释都会返回一个名为response的对象,并且任何使用@then注释的定义都会在响应中声明某些内容。 我的问题是,是否有一种方法可以将这些存储在单独的文件中?我已经阅读了一些关于“世界”的内容,但我不确定这是否是我正在寻找的内容,尽管在github(https://github.com/cucumber/cucumber-jvm/blob/master/groovy/src/test/groovy/cucumber/runtime/groovy/compiled_stepdefs.groovy)上查看了示例项目,但我无法使其发挥作用。

我想要实现的一个例子是:

 Scenario:
 When I say hello
 Then Hello should be printed

正如我的情景。然后,我希望有两个共享变量的类:

 class sayHello{

   def response     

   @When('^I say hello$')
   def iSayHello() {
     response = "hello"
   }
 }

 class printHello{

   @Then('^Hello should be printed$')
   def iPrintHello() {
     assert response == "hello"
   }
 }

我知道我可以使用spring将变量注入到类中,但我想知道是否有另一种方法,如果我使用'World'对象在正确的轨道上。 提前致谢

1 个答案:

答案 0 :(得分:1)

我使用groovy的mixin功能找到了解决方案。 mixin允许类继承另一个类的方法,并在运行时使用类变量。

使用上面的示例,我的解决方案如下所示:

@Mixin(printHello)
class sayHello {

   @When('^I say hello$')
   def iSayHello() {
     response = "hello"
   }
}

class printHello {

   static def response

   @Then('^Hello should be printed$')
   def iPrintHello() {
      assert response == "hello"
   }
}

这允许我从任何类中一般设置响应对象,然后在公共步骤文件中对其进行断言。