我对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 Cucumber
和Given 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
吗?
答案 0 :(得分:6)
这可能不是最好的方式,但我抓住了我的想法:
@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$")
正如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 {
// ...
}
这也将原因传递给函数作为其第一个参数。但我不确定你应该在这里使用相同的功能,因为情况不同。