我正在Clojure中测试deftype
和defprotocol
,但我有点蠢。
我正在使用莱宁根。我的核心文件(src/core.clj
)如下所示:
(defprotocol Speaker
(say [speaker message]))
(deftype Person [name]
Speaker
(say [_ message] (str name ": " message)))
我的测试文件(test/core.clj
)如下所示:
(deftest people-can-talk
(is (= "Peter: hello" (say (Person. "Peter") "hello"))))
当我执行该测试时(使用lein test
),我收到以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: Unable to resolve classname: Person, compiling:(my-project/test/core.clj:2)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:6416)
at clojure.lang.Compiler.analyze(Compiler.java:6216)
我相信它告诉我Person
没有定义。但它是!如果不是,Clojure不会抛出错误吗?我缺少一些明显的语法错误吗?
我正在使用clojure 1.3.0。
答案 0 :(得分:1)
要在另一个软件包/文件中使用deftype定义的类,您需要(导入)它们,或提供完整的软件包名称,如(core.Person. "Peter")
- 或者core.clj的名称空间。
此外,“lein test”仅加载测试文件。如果要引用其他文件中的任何内容,则需要在测试文件中使用或要求该文件。
答案 1 :(得分:0)
您的建议没有为我解决类引用错误。但是实施一种工厂方法"如下所述是一种解决方法: another stackoverflow answer on this issue