testing - 你如何在 clojure 中使用它自己的命名空间之外的类型?

标签 testing clojure leiningen deftype

我用 leiningen 建立了一个名为 techne 的项目。我创建了一个名为 scrub 的模块,其中包含一个名为 Scrub 的类型和一个名为 foo 的函数。

技术/scrub.clj:

(ns techne.scrub)
  (deftype Scrub [state]
    Object
     (toString [this]
     (str "SCRUB: " state)))

(defn foo
  [item]
  (Scrub. "foo")
  "bar")

技术/scrub_test.clj:

(ns techne.scrub-test                                                                                                                                             
  (:use [techne.scrub] :reload-all)                                                                                                                               
  (:use [clojure.test]))                                                                                                                                          


(deftest test-foo                                                                                                                                                 
  (is (= "bar" (foo "foo"))))                                                                                                                                                           

(deftest test-scrub                                                                                                                                               
  (is (= (Scrub. :a) (Scrub. :a)))) 

当我运行测试时,出现错误:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to resolve    classname: Scrub (scrub_test.clj:11)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5376)
    at clojure.lang.Compiler.analyze(Compiler.java:5190)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)

如果我删除 test-scrub 一切正常。为什么 :use techne.scrub “导入”函数定义而不是类型定义?如何引用类型定义?

最佳答案

因为 deftype生成一个类,您可能需要在您的 ns 定义中使用 (:import [techne.scrub Scrub]) 在 techne.scrub-test 中导入该 Java 类。

实际上我在这里写了关于 defrecord 的相同内容:

您可以做的另一件事是在 scrub 中定义一个构造函数:

(defn new-scrub [state] 
  (Scrub. state))

然后你就不需要在 test-scrub 中导入 Scrub 了。

关于testing - 你如何在 clojure 中使用它自己的命名空间之外的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3690784/

相关文章:

scala - 如何使用 SpecWithJUnit 将测试标记为 pendingUntilFixed

clojure - 如何在 clojure 中漂亮地打印引用列表?

clojure - clojure 中# 和 % 的名称是什么?

java - 为什么 Closure-maven-plugin 没有选择正确的 Java 版本?

swing - 图标消失在由 Leiningen 制作的 uberjar 中

java - lein自定义java类未找到异常

testing - JUnit 使用 Spring MVC 测试 web.xml

unit-testing - 测试不编译 : "the async keyword is missing from the function declaration"

Javascript:比较 Protractor 中的值

clojure - Leiningen - 如何杀死子进程?