为什么@Given不可重复?

时间:2015-04-09 13:20:15

标签: java annotations bdd cucumber-jvm

我对Cucumber(jvm)都很陌生,这一切看起来都很精致,但是:

我真的不知道如何通过各种方式(优雅地)通过单一方法实现多个初始条件(来自各种场景)。

例如:

Scenario: I really am bad
    Given I really am inexperienced with Cucumber
    When I try to work
    Then what I produce is of poor quality

Scenario: I am on the way to become good (hopefully)
    Given I am a noob
    When I learn new things
    And I practice
    Then my level improves

由于Given I really am inexperienced with CucumberGiven I am a cuke noob(虽然不是语义相同)足够接近我以完全相同的方式实现,我希望能够< em>将链接到相同的方法,但

@Given("^I really am inexperienced with Cucumber$")
@Given("^I am a cuke noob$")
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

但上面提到的代码不会编译,因为cucumber.api.java.en.@Given注释不是java.lang.annotation.@Repeatable ...

一个简单的解决方案就是做一些像

这样的事情
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

@Given("^I really am inexperienced with Cucumber$")
public void check_I_really_am_inexperienced_with_Cucumber() throws Throwable {
    checkMyLevelIsGenerallyLow();
}

@Given("^I am a cuke noob$")
public void check_I_am_a_cuke_noob() throws Throwable {
    checkMyLevelIsGenerallyLow();
}

它可以正常工作,但需要大量代码才能处理简单的事情,我很确定还有其他方法。

甚至,当我问自己写下这个问题时,&#34;我是否只是从右侧接近这个问题?&#34;,就是我想要在BDD方面实现一个好主意?

我认为这并不是一件坏事,因为小黄瓜应该保持语义和句子结构,词汇选择依赖于上下文(因此场景)。然而,我应该以任何我喜欢的方式实现它。

所以要把它全部包起来:

  • @Given@Repeatable吗?
    • 如果是这样,为什么不呢?还有另外一种方法吗?
    • 如果没有,我在方法方面缺少什么?

3 个答案:

答案 0 :(得分:6)

关于多表现的@given

这可能不是最好的方式,但我抓住了我的想法:

@Given("^I really am inexperienced with Cucumber$|^I am a cuke noob$")
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

它有效! 这正是我所寻找的,甚至可以像这样更具可读性:

@Given("^I really am inexperienced with Cucumber$"+
      "|^I am a cuke noob$")

关于非重复性@given

正如blalasaadri所说,@Given可能是@Repeatable,但仅限Java8,因为{8}在Java8中引入。

特别感谢

致Ceiling Gecko让我记住,最简单,最明显的解决方案通常是最好和最优雅的。

答案 1 :(得分:4)

远射但不会:

@Given("^I really am inexperienced with Cucumber$")
@And("^I am a cuke noob$")
public void checkMyLevelIsGenerallyLow() throws Throwable {
    // some very clever code to assess then confirm my mediocre level ... something like if(true) ...
}

按预期工作?

答案 2 :(得分:0)

注释不可重复的一个原因是,Java 8中可重复的注释是新的。因此,将它们用于库仍然存在问题,因为您将大大限制用户群。 (请记住,特别是大公司在适应新技术方面进展缓慢。)

作为替代方案,您可以使用相同的Java函数和类似的Given描述;比如

Given My cucumber level is low because I'm a cuke noob

Given My cucumber level is low because I'm inexperienced

可能都被

捕获
@Given("My cucumber level is low because I'm (.*)")
public void checkMyLevelIsGenerallyLow(String reason) throws Throwable {
    // ...
}

这也将原因传递给函数作为其第一个参数。但我不确定你应该在这里使用相同的功能,因为情况不同。