如何使JBehave与期望驱动的API很好地协同工作?

时间:2015-09-16 17:05:16

标签: java bdd jbehave

编写BDD场景的传统方法是:

 Given [some preconditions]
 When [My code runs]
 Then [some stuff happened]

但是我正在使用一个类似于模拟的API,它希望在运行测试代码之前定义期望(即,#34;发生了一些事情")。为了对这个API表示同情,我必须写下这样的故事:

Given [some preconditions]
And [the expectation that some stuff is going to happen]
When [My code runs]
Then [the expectations I defined above were met]

我不想这样做。我可以看到围绕它的两种方式,我也不想做:

  • 隐式设置"任何"在某些"给定"步骤,使用"捕获"模拟API的功能,用于将调用存入字段,并检查"然后"步骤。
  • ...或制作"当" step设置一个字段,告诉AfterScenario步骤运行我的代码,因此在设置了期望之后将其推迟(但阻止我检查其他后置条件)

我真正喜欢的是JBehave查看Then步骤,找到设置期望的部分,然后在When之前运行。

Spock通过其模拟实现了这一点(评论显示执行顺序):

def translator = Mock(Translator)

void "test something" {
    given: 
      testObj = new MyThing(translator)  // 1
    when:
      def actual = testObj.run("foo")   // 3
    then:
      1 * translator.process("foo") << "bar" // 2 (setup) 
                                             // and 4 (post-check)
      actual == "bar"  // 5
}

是否有一个简洁的模式让JBehave这样做?

1 个答案:

答案 0 :(得分:1)

奇怪的是,第一个BDD工具JBehave 1.0曾经拥有自己的模拟框架,并且过去的行为方式与Spock相同。这很讨厌。真的,真的很讨厌(从BDD的角度来看;从严格的模拟&#34;测试的角度看它很好)。

模式是当时任何模拟框架工作的唯一方式,并导致Mockito的发明和其他的#34; nice&#34;模拟框架(以及从JBehave 2.0中删除上述模拟框架,因为它不再需要)。

所以,&#34;整洁的模式&#34;如果Mockito没有为你完成这项工作,那就是编写自己的嘲弄框架。不那么简洁的模式是编写自己的BDD框架。拥有一个与现实相匹配的模拟框架通常更简单的IMO。

或者,你可能会发现你正在使用的模拟框架有一个很好的&#34;模式或允许您声明存根而不是模拟,这可能会有所帮助。不知道你使用哪个框架很难说。