Clojure - deftype被忽略 - 无法在测试中解析类名

时间:2011-11-20 13:47:46

标签: syntax clojure deftype

我正在Clojure中测试deftypedefprotocol,但我有点蠢。

我正在使用莱宁根。我的核心文件(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。

2 个答案:

答案 0 :(得分:1)

要在另一个软件包/文件中使用deftype定义的类,您需要(导入)它们,或提供完整的软件包名称,如(core.Person. "Peter") - 或者core.clj的名称空间。

此外,“lein test”仅加载测试文件。如果要引用其他文件中的任何内容,则需要在测试文件中使用或要求该文件。

答案 1 :(得分:0)

您的建议没有为我解决类引用错误。但是实施一种工厂方法"如下所述是一种解决方法: another stackoverflow answer on this issue