Clojure - deftype игнорируется - не удается разрешить имя класса в тестах - PullRequest
3 голосов
/ 20 ноября 2011

Я тестирую deftype и defprotocol в Clojure, но я немного рассола.

Я использую leiningen.Мой основной файл (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 ]

1 голос
/ 20 ноября 2011

Чтобы использовать классы, определенные deftype, в другом пакете / файле, вам необходимо (импортировать) их или предоставить полное имя пакета, например (core.Person. "Peter") - или любое другое пространство имен для core.clj.

Кроме того, «lein test» загружает только тестовые файлы.Если вы хотите сослаться на что-либо в другом файле, вам нужно использовать или требовать этот файл в тестовом файле.

0 голосов
/ 30 декабря 2014

Ваше предложение не устранило для меня ошибку ссылки на класс.Но реализация «фабричного метода», как описано ниже, является обходным путем: еще один ответ на стекопоток по этой проблеме

...