如何在clojure中存储langohr RabbitMQ交互?

Pho*_*ong 6 clojure rabbitmq langohr

我试图将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")))))
Run Code Online (Sandbox Code Playgroud)

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

java.lang.ClassCastException:
redwood.env_test$fn__2210$fn__2211 cannot be cast to clojure.lang.IFn$OLO
Run Code Online (Sandbox Code Playgroud)

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

我已经测试了其他场景,并且我已经使用上面的代码结构成功地将cheshire(json解析clojure lib)函数存根.我谦恭地理解为什么我的langohr存根不工作以及我如何能在一个优雅的方式做到这一点的提示请求援助.

Chr*_*ins 6

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

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

(with-redefs [langohr.basic/ack (fn [a1 ^long a2] true)] ...)
Run Code Online (Sandbox Code Playgroud)

  • 这很重要,因为调用函数(在您的示例中为`stub)被编译为derefs var`langhor.basic/ack`的代码,然后尝试将结果转换为`IFn $ OLO`.发生这种情况是因为编译器发现,在编译时,`langhor.basic/ack`指的是该类型的函数,并且它需要进行强制转换以便能够传递一个原语(未装箱的)长.没有看到一些代码,我不能说为什么`nack`没有给你同样的错误,但请记住,这是对`stub`的调用,而不是redef本身的调用,失败了,而且编译时间很重要. (2认同)