2015-09-16 25 views
2

写BDD场景的传统方法是:我怎样才能使JBehave符合预期驱动的API很好地工作?

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

然而当我想要的预期(也就是,“有些东西发生了”)下测试的代码之前定义的运行模拟类API工作。为了同情该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将调用隐藏到字段中,并在“Then”步骤中检查它们。
  • ......或使“当”步骤设置的场告诉了AfterScenario步运行我的代码,因此它推迟到以后的预期已经设置(但阻止我检查其他后置)

我真的很想为JBehave看当时的步骤,找到他们的是设定预期的部分,和那些运行前的当。

斯波克达到这个与它的嘲笑(言论表明执行顺序):

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

奇怪的是,JBehave 1.0,第一BDD工具,用于有自己的模拟框架,并用于以同样的方式作为斯波克行为。这是令人讨厌的。真的,真的很讨厌(从BDD的角度来看,从“严格的模拟”测试角度来看,这很好)。

该模式是当时任何嘲讽框架的唯一工作方式,并导致Mockito和其他“好”嘲笑框架的发明(以及从JBehave 2.0中删除上述嘲笑框架,因为它不再需要)。

因此,“纯模式”是写自己的模拟框架,如果没有的Mockito不会为你做的工作。不太整洁的模式是编写你自己的BDD框架。拥有一个符合现实的嘲讽框架通常更简单的IMO。

或者,你可能会发现你正在使用的模拟框架有一个“好”模式或者你可以定义存根,而不是嘲笑,这可能会有帮助。不知道你正在使用哪个框架,很难说。

+0

感谢。我使用的“模拟”框架实际上是一个模拟REST服务; rest-client-driver,其中您告诉嵌入式Jetty需要预期的HTTP请求,所以我不能切换到Mockito。 – slim

+0

@slim这里没有大量的代码。打赌你可以将它分叉并写出适合你在几天内做的事情。 – Lunivore