2015-09-16 64 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