clojure - 如何在 clojure 中对 langohr RabbitMQ 交互进行 stub ?

标签 clojure rabbitmq langohr

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

所以,我尝试在测试中重新绑定(bind) 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

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

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

最佳答案

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

您必须将其重新定义为相同类型。试试这个:

(with-redefs [langohr.basic/ack (fn [a1 ^long a2] true)] ...)

关于clojure - 如何在 clojure 中对 langohr RabbitMQ 交互进行 stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14461646/

相关文章:

clojure - 如何使用clojure-liberator实现用户认证?

python - 很难启动 Rabbitmq Server 并想知道为什么不断收到此错误 init :do_boot/3 line 817

grails - grails服务::多个项目

ubuntu - RabbitMQ On Ubuntu 14.04 服务器配置

clojure - 如何在 Langohr 中容忍 RabbitMQ 重启?

java - 在 clojure 中,assocEx 是做什么用的?

clojure - Reader Monad、代码重构、动态绑定(bind)变量?

java - 如何在 Clojure 中加载程序资源