2015-08-18 98 views
2

的否定這個工作對我來說:Clojure的測試:測試斷言

(is (thrown? AbstractMethodError (.fun obj 1))) 

但這並出現以下錯誤炸燬

(is (not (thrown? AbstractMethodError (.fun obj 1)))) 

java.lang.RuntimeException: Unable to resolve symbol: thrown? in this context 

大概是「甩?」在「是」內部有一些特殊的含義,當我把「不」插入時是不可見的。

那麼我該如何測試一個拋出斷言的否定呢?

+0

[Clojure單元測試的可能重複。我如何測試函數是否引發異常?](http://stackoverflow.com/questions/32063244/clojure-unit-testing-how-do-i-test-if-a-function-throws-an-exception ) –

+0

@NathanDavis這是相關的,但這意味着成爲一個更大問題的一個獨特部分。 – interstar

回答

3

你是對的,thrown?special assertion必須出現在is之後。如果你想測試一個異常沒有拋出(換句話說,評估的東西通話),你可能想要做這樣的事情:

(is (.fun obj 1))

雖然有一個問題:它會失敗,如果結果是錯誤的(false,nil)。要完全確定:

(let [r (.fun obj 1)] 
    (is (= r r))) 

(這是一種重言式,只會在它拋出異常時纔會失敗)。

+1

其實,我真正感興趣的測試是obj是否實際上有一個方法.fun。你能想出一個更好的方法來做到這一點? – interstar

+1

通過反射api。例如,請參閱此答案:http://stackoverflow.com/questions/5821286/how-can-i-get-the-methods-of-a-java-class-from-clojure –