6

我正在尝试对 RabbitMQ 交互进行存根,因为这些并不是我正在编写的应用程序的主要目的。

所以,我尝试在我的测试中重新绑定 langohr 函数,如下所示:

(defn stub [ch]
  (langohr.basic/ack ch 1))

(deftest test-stub
  (with-redefs [langohr.basic/ack (fn [a1 a2] true)]
    (is (= true (stub "dummy")))))

当我运行测试时lein test,我得到一个

java.lang.ClassCastException:
redwood.env_test$fn__2210$fn__2211 cannot be cast to clojure.lang.IFn$OLO

我一直在尝试其他几种方法,包括不同的测试框架来重新定义或重新绑定 langohr 库函数,但没有任何进展。

我已经测试了其他场景,并且我已经成功地使用上述代码结构对 cheshire (json parsing clojure lib) 函数进行了存根。我谦虚地请求帮助,以了解为什么我的 langohr 存根不起作用,以及如何以优雅的方式做到这一点的提示。

4

1 回答 1

6

发生 ClassCastException 是因为 langohr.basic/ack 是一个接受原始参数的函数 - 具体来说,它是 clojure.lang.IFn$OLO 类型,其中 OLO 代表“object, long, object”。

你必须重新定义它是相同的类型。试试这个:

(with-redefs [langohr.basic/ack (fn [a1 ^long a2] true)] ...)
于 2013-01-23T00:42:35.400 回答