Clojure测试:如何验证旧命名空间未被新命名空间引用或访问
测试旧命名空间是否被后续代码引用的方案
静态代码扫描:使用clj-kondo这类静态分析工具遍历后续年份场景的代码,直接查找是否存在对旧命名空间的
require声明,或者直接引用旧命名空间符号(如old.ns/func)的情况。clj-kondo能输出代码依赖的所有命名空间,轻松筛选出目标旧命名空间的引用记录。运行时加载追踪:在后续场景代码执行前,包装Clojure的
require函数来记录所有被加载的命名空间:(def loaded-namespaces (atom #{})) (alter-var-root #'clojure.core/require (fn [original-fn] (fn [& args] (let [target-nses (filter symbol? args)] (swap! loaded-namespaces into target-nses)) (apply original-fn args))))执行后续场景代码后,检查
@loaded-namespaces集合是否包含目标旧命名空间的符号。已加载命名空间全量检查:用
all-ns函数获取当前JVM中所有已加载的命名空间,直接与旧命名空间列表对比:(def target-old-ns '#{old.scenario.ns.v1 old.scenario.ns.v2}) (clojure.set/intersection target-old-ns (set (map ns-name (all-ns))))这个方法比
find-ns更可靠,all-ns会返回所有已加载的命名空间对象,不存在映射遗漏问题。隔离环境测试:启动独立的JVM进程,仅加载后续年份场景的代码,执行完成后用
all-ns检查是否存在旧命名空间。这种方式能彻底避免其他代码的干扰,结果更准确。
内容的提问来源于stack exchange,提问作者f1wade
相关产品推荐
相关产品推荐

