2015-08-18 100 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 –