Java 为什么不是';给定的可重复性?

Java 为什么不是';给定的可重复性?,java,annotations,bdd,cucumber-jvm,Java,Annotations,Bdd,Cucumber Jvm,我对Cucumber(jvm)完全陌生,它看起来很好,但: 我真的不知道如何让多个初始条件(来自不同的场景)以不同的方式(优雅地)被一个方法实现 例如: 由于给定我对Cucumber确实缺乏经验和给定我是cucke noob(虽然在语义上不完全相同)非常接近,因此我希望能够将它们链接到相同的方法,但 @Given(“^I对Cucumber$真的没有经验”) @给定(“^I is cuke noob$”) public void checkMyLevel GenerallyLow()抛出可丢弃{

我对Cucumber(jvm)完全陌生,它看起来很好,但:

我真的不知道如何让多个初始条件(来自不同的场景)以不同的方式(优雅地)被一个方法实现

例如:

由于
给定我对Cucumber确实缺乏经验
给定我是cucke noob
(虽然在语义上不完全相同)非常接近,因此我希望能够将它们链接到相同的方法,但

@Given(“^I对Cucumber$真的没有经验”)
@给定(“^I is cuke noob$”)
public void checkMyLevel GenerallyLow()抛出可丢弃{
//一些非常聪明的代码来评估然后确认我的平庸水平…比如if(true)。。。
}
但是上面给出的代码不会编译为
cucumber.api.java.en。@给定的
注释不是
java.lang.annotation。@Repeatable

一个简单的解决办法是做如下事情

public void checkMyLevelIsGenerallyLow()抛出可丢弃的{
//一些非常聪明的代码来评估然后确认我的平庸水平…比如if(true)。。。
}
@给定(“^我真的对黄瓜元缺乏经验”)
公共无效检查\u我\u真的\u没有经验\u可以扔掉{
CheckMyLevel通常为低();
}
@给定(“^I is cuke noob$”)
公共无效支票可丢弃{
CheckMyLevel通常为低();
}
这将工作得很好,但需要大量代码来完成简单的事情,我很确定还有其他方法

甚至,当我问自己写下这个问题时,“我只是从正确的角度来处理这个问题吗?”,就BDD而言,我试图实现的是一个好主意吗

我认为这并不全是坏事,因为小黄瓜应该掌握语义和句子结构,词汇选择取决于上下文(因此是情景)。然而,我应该可以自由地以我喜欢的任何方式实施它

总而言之:
  • 给定的
    是否应
    @可重复?
    
    • 如果是,为什么不是呢?还有别的办法吗
    • 如果没有,我在方法上遗漏了什么

希望渺茫,但不会:

@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) ...
}

按预期工作?

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

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

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

这两个都可能被抓到

@Given("My cucumber level is low because I'm (.*)")
public void checkMyLevelIsGenerallyLow(String reason) throws Throwable {
    // ...
}
这也会将原因作为函数的第一个参数传递给函数。但是我不确定您是否应该在这里使用相同的函数,因为情况不同。

关于多表达@given 这可能不是最好的方法,但我挠头时想到:

@Given(“^I真的对Cucumber$没有经验^我是cuke noob$”)
public void checkMyLevel GenerallyLow()抛出可丢弃{
//一些非常聪明的代码来评估然后确认我的平庸水平…比如if(true)。。。
}
而且它有效! 这正是我一直在寻找的,甚至可以让它更具可读性,如下所示:

@Given(“^I对Cucumber$真的没有经验”+
“^I'm cuke noob$”)
关于给定的不可重复性 正如blalasaadri所述,
@给定的
可能是可重复的
,但仅来自Java8,而且由于在Java8中引入了可重复的

特别感谢
感谢Gecko,他让我记住,最简单、最明显的解决方案通常是最好、最优雅的。

除了任何特定的原因外,Java 8还新增了可重复注释。因此,使
@Given
可重复将限制该库与Java 8(或更新版本)一起使用。该死的,你太快了:D我甚至在一篇相当长且不太容易阅读的文章中几乎没有按submit键,你已经获得了非常有用的洞察力!关于@repeatable,你是绝对正确的。但是,对于一些变通方法,你有什么想法吗?它违背了目的,因为它需要在知道它必须以与另一个相同的方式来处理的情况下对句子进行处理!除此之外,我还想知道。但奇怪的是,这并不令人满意。从语义上讲,我希望它是一个
@或
注释,因为如果我在一个或另一个案例中,而不是在案例A和案例B中,我将执行此方法。啊,该死!!!它的效果是你想要的一半。你可以添加一个其他条件,但不能添加多个条件:'(你在这方面启发了我:)我尝试了一些有效的方法,看看我的答案。很好的一个,考虑到(嘿)我以前从未处理过Cucumber,我的答案是我通过浏览Cucumber文档盲目拼凑出来的(读:我不知道我在做什么),所以,你找到了一个合适的答案,这太好了。:)你也可以接受你自己的答案(这是正常的),这样它就可以为未来的读者提供更多的关注度。是的,我只是在重新格式化它,并从你的答案和@blalasaadri's中添加位,以便它对未来的读者尽可能全面和有用。顺便说一句,我猜这很好;)
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 {
    // ...
}