Clojure单元测试调用自定义函数时编译失败求助
问题原因与解决方案
这个问题的核心是测试文件的命名空间和源文件完全重复,导致Clojure无法正确区分并加载源文件中的函数,进而找不到side-eq符号。
具体问题分析
你在src/hello/core.clj中定义的命名空间是hello.core,但在test/hello/core.clj里也使用了完全相同的hello.core命名空间。在Clojure中,同名的命名空间会产生加载冲突:当你运行测试时,Clojure可能只会加载其中一个命名空间(通常是后加载的测试文件),而测试文件里并没有定义side-eq函数,自然会抛出"无法解析符号"的异常。
至于简单的is (= 1 1)能正常运行,是因为is是clojure.test库提供的断言函数,你的测试文件已经通过:use clojure.test引入了它,不需要依赖自己的业务代码,所以不受命名空间冲突的影响。
修复步骤
修改测试文件的命名空间
按照Clojure测试的惯例,测试文件的命名空间应该和源文件对应,但加上-test后缀。同时建议把测试文件名改成core_test.clj(下划线分隔,和命名空间的-test对应),修改后的测试文件开头应该是:(ns hello.core-test (:use clojure.test) (:require [hello.core :refer :all]))注意去掉重复的
(use 'clojure.test)和不需要的(:gen-class)——测试文件不需要生成Java类。修正测试代码结构
完整的测试文件代码应该是这样的:(ns hello.core-test (:use clojure.test) (:require [hello.core :refer :all])) (deftest side-eq-tests (is (= false (side-eq "aws")))) (run-tests)确认项目结构
你的项目结构现在应该是:src/hello/core.clj(业务代码,命名空间hello.core)test/hello/core_test.clj(测试代码,命名空间hello.core-test)
这样修改后,Clojure就能正确区分源文件和测试文件的命名空间,顺利加载side-eq函数并执行测试了。
内容的提问来源于stack exchange,提问作者Xentai
相关产品推荐
相关产品推荐

