2013-01-22 13 views
5

Tôi đang cố gắng phân tích các tương tác của RabbitMQ, vì chúng không thực sự là mục đích chính của ứng dụng mà tôi đang viết.Làm cách nào để phân tích các tương tác của Langohr RabbitMQ trong clojure?

Vì vậy, tôi đã cố gắng rebinding chức năng langohr trong các thử nghiệm của tôi như sau:

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

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

Khi tôi chạy thử nghiệm với lein test, tôi nhận được một

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

Tôi đã cố gắng một số cách khác bao gồm các khung kiểm tra khác nhau để xác định lại hoặc rebind các chức năng lib langohr không có tiến bộ.

Tôi đã thử nghiệm các tình huống khác và tôi đã thành công trong việc phân tích các hàm cheshire (json phân tích cú pháp clojure) với cấu trúc mã ở trên. Tôi khiêm tốn yêu cầu hỗ trợ trong việc hiểu tại sao bài hát langohr của tôi không hoạt động và để biết các mẹo về cách tôi có thể thực hiện điều này một cách thanh lịch.

Trả lời

6

ClassCastException xảy ra vì langohr.basic/ack là hàm nhận đối số nguyên thủy - cụ thể, nó thuộc loại clojure.lang.IFn $ OLO, trong đó OLO là viết tắt của "đối tượng, dài, đối tượng".

Bạn phải xác định lại nó có cùng loại. Hãy thử điều này:

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

Cảm ơn ông Perkins, tôi đã xem mã clojure và thấy chức năng OLO trong java ở đâu. Tôi đang bối rối bởi vì khi tôi rebind đến một chức năng của sự lựa chọn của tôi, tại sao nó nên vấn đề gì các loại đối số chức năng của tôi nên được? Tôi nghĩ rằng var mới là độc lập với cũ. Langohr cũng có một hàm 'langohr.basic/nack' được viết với cùng một triển khai như ack, nhưng hàm này đã được định nghĩa lại thành công mà không có nhận dạng lớp. – Phong

+2

Điều quan trọng bởi vì hàm gọi ('stub' trong ví dụ của bạn) được biên dịch thành mã mà derefs var' langhor.basic/ack' và sau đó cố gắng đưa kết quả đến 'IFn $ OLO'. Điều này xảy ra bởi vì trình biên dịch thấy rằng, tại thời gian biên dịch, 'langhor.basic/ack' đề cập đến một hàm của kiểu đó, và nó cần thực hiện phép đúc để có thể vượt qua một đoạn nguyên thủy (không được mở hộp). Nếu không nhìn thấy một số mã, tôi không thể nói lý do tại sao 'nack' không cho bạn lỗi tương tự, nhưng hãy nhớ rằng đó là lệnh gọi' stub' và không tự sửa lại, thất bại và nhập vào các vấn đề biên dịch. –

+0

cảm ơn ông Perkins, rất sâu sắc và hữu ích. – Phong

Các vấn đề liên quan