Clojure测试:测试断言的否定

5
这对我而言是可行的:
(is  (thrown? AbstractMethodError (.fun obj 1) ))

但这会崩溃

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

以下是相关错误信息:

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

我猜"thrown?"在"is"里有一些特殊的意义,在我放置否定词"not"的时候并不可见。

那么,我该如何测试类似于"thrown"这样的断言的否定呢?


可能是Clojure单元测试。如何测试函数是否抛出异常?的重复问题。 - Nathan Davis
@NathanDavis 这个问题是相关的,但它是一个更大问题中独立的一部分。 - interstar
1个回答

5
您说得对,thrown?是一个特殊断言,必须出现在is之后。如果您想测试未抛出异常(换句话说,调用已计算出结果),您可能需要执行以下操作:

(is (.fun obj 1))

尽管这样做有一个问题:如果结果为falsey(false、nil),它将失败。要完全确定:

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

这是一个自证不矛盾的命题,只有在抛出异常时才会失败。


1
其实,我真正感兴趣的是测试 obj 是否实际拥有 .fun 方法。你能想到更好的方法吗? - interstar
1
通过反射API。例如,参见此答案:https://dev59.com/OG025IYBdhLWcg3wvIu2 - Diego Basch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接