2013-01-22 20 views
5

Sto provando a bloccare le interazioni RabbitMQ, in quanto queste non sono realmente lo scopo principale dell'applicazione che sto scrivendo.Come faccio a bloccare le interazioni Langohr RabbitMQ in clojure?

Così, ho provato rebinding le funzioni Langohr nel mio test in questo modo:

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

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

Quando eseguo il test con lein test, ho un

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

Ho cercato diversi altri modi tra cui diversi framework di test per ridefinire o riassociare le funzioni lib libre senza alcun progresso.

Ho provato altri scenari e ho risolto con successo le funzioni di cheshire (json parsing clojure lib) con la precedente struttura di codice. Chiedo umilmente assistenza per capire perché i miei mozziconi di langohr non funzionano e per consigli su come posso farlo in maniera elegante.

risposta

6

ClassCastException si verifica perché langohr.basic/ack è una funzione che accetta un argomento primitivo, in particolare, è di tipo clojure.lang.IFn $ OLO, dove OLO sta per "oggetto, oggetto lungo".

Devi ridefinirlo dello stesso tipo. Prova questo:

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

Grazie Mr. Perkins, ho esaminato il codice del clojure e ho visto dove si trova la funzione OLO in java. Sono confuso perché quando mi ricollego a una funzione di mia scelta, perché dovrebbe essere importante quale dovrebbe essere il mio tipo di argomento di funzione? Pensavo che la nuova var fosse indipendente dal vecchio. Langohr ha anche una funzione 'langohr.basic/nack' scritta con la stessa implementazione di ack, tuttavia questa funzione è stata correttamente reimpostata senza classcastexception. – Phong

+2

È importante perché la funzione di chiamata ('stub' nel tuo esempio) viene compilata nel codice che derefs la var' langhor.basic/ack' e quindi prova a trasmettere il risultato a 'IFn $ OLO'. Questo accade perché il compilatore vede che, in fase di compilazione, 'langhor.basic/ack' si riferisce a una funzione di quel tipo, e ha bisogno di fare il cast per poter passare un primitivo (unboxed) lungo. Senza vedere alcun codice, non posso dire perché 'nack' non ti sta dando lo stesso errore, ma tieni presente che è la chiamata a' stub', e non il redef stesso, che fallisce, e che il digitare in fase di compilazione. –

+0

grazie ancora Mr. Perkins, molto perspicace e utile. – Phong

Problemi correlati