2014-01-05 53 views
1

在我的遊戲中有許多低級方法! 2.0應用程序(Java)調用外部Web服務(通過REST指定Neo4j)。他們每個人返回一個Promise<WS.Response>。要測試這些方法,我目前正在通過onRedeem在其返回值上安裝Callback<WS.Response>Callback包含要在個人WS.Response上執行的斷言。每個測試都依賴於我通過setUpClasstearDownClass分別安裝/拆卸的某些特定固定裝置。在Play Framework 2.0中測試異步Web服務調用

我面臨的問題是,由於我的測試代碼是完全異步的,拆除邏輯最終在之前被調用,所有Callback都有機會運行。因此,並非所有的燈具都將被移除,並且數據庫處於與運行測試之前的狀態不同的狀態。

解決此問題的一種方法是將get()與正在測試的函數返回的Promise對象的某個任意超時聯繫起來,但該解決方案對我來說似乎相當脆弱和不可靠。 (如果由於某些原因,在我的應用程序的控制下,Web服務調用在超時內沒有完成?在這種情況下,即使我的代碼實際上是正確的,我的測試也會失敗或出錯。)

我的問題是:是否有一種測試代碼的方法可以調用非阻塞的外部Web服務,並且仍然可以確保數據庫的一致性?如果沒有,上述兩種方法中的哪一種是測試這種代碼的「規範」/可接受的方式?

回答

3

如果由於某種原因,在我的應用程序的控制下,Web服務調用在超時內沒有完成,該怎麼辦?

這是任何測試調用外部Web服務的問題,無論是否爲異步。這就是爲什麼你應該以某種方式嘲弄你的Web服務調用,要麼使用假的Web服務,要麼假的實現訪問Web服務的代碼。

您可以使用例如Betamax。

我已經編寫了異步代碼的測試代碼,我相信你的「脆弱」方法實際上是正確的。