如何在Clojure测试中检查AssertionException是否被抛出?

4

我正在尝试为我的:pre:post条件编写单元测试,我的第一个想法是这样的:

(ns myproj.battle-test
  (:use clojure.test
        myproj.battle))

(deftest lose-only-positive-amount-of-health
  (let [actor {:health 100}]
    (is (thrown? AssertionException
          (:health (lose-health actor -5))))))

但我不知道如何从我的测试文件中引用AssertionException,并获得一个异常:

java.lang.IllegalArgumentException: Unable to resolve classname: AssertionException

我尝试了各种方法(Google并没有提供有用的信息,可能是因为这个问题太简单了),但没有任何运气,那么我该如何检查是否抛出了 AssertionException
我意识到这非常适合初学者的问题;这是我在Clojure中的前几行 :)
1个回答

4

异常是一个类,所以只需导入它。

(ns myproj.battle-test
  (:use clojure.test
        myproj.battle)
  (:import a.package.which.contains.AssertionException))
...

请定位AssertionException所在的包,并将其替换为上面代码中的a.package.which.contains。或者你可以像上面的:import子句一样使用全名,但如果你在多个地方使用该类,则这可能会很麻烦。
更新:我犯了一个错误。没有AssertionException这个类。有一个类AssertionError,由于它位于java.lang包中,因此会自动导入。Clojure的pre/post条件会抛出它,因此只需使用AssertionError而不是AssertionException,你的代码就应该可以正常运行了。

太好了!我是个白痴。非常感谢你指出本应很明显的问题 - 我在寻找一个不存在的问题! - GraemeF

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