设置我使用 Clojure 对纯 Java 库进行单元测试的环境

Setting up an environment where I use Clojure to unit-test a pure Java library

我必须编写一个纯 Java 库。但我想用 Clojure 对其进行单元测试。

所以我想设置这样的东西:两个项目存储库。 Java 代码本身,以及包含该库并对其运行单元测试的第二个 Leiningen 项目。

我做 TDD,所以这是一个相当紧凑的迭代(即编写测试,编写代码以通过它)。我可以同时在 Emacs 中打开两个项目的代码,但我想知道如何自动连接。

例如,理想情况下,每当我执行 "lein test" 时,它都会获取最新的 Java 代码,编译它(如果未编译),将其拉入Clojure 项目并在测试中使用它。

我怎样才能做到这一点?我目前有 Lein project.clj 文件引用本地 Maven 存储库中的 Java 库。但是我不确定 Lein 是否会自动从 Maven 更新,除非版本号发生变化,而且我认为我不想为代码库的每一次更改/每 2 或 3 次更新版本编号分钟。 (至少,肯定不是手动的。)

有人对此有经验吗?

您可以使用简单的 java 互操作来做到这一点。你根本不应该为你的本地文件(java 或 clojure)使用 maven,只为外部库使用。

这是一个示例:

Java代码:

~/xpr > tree
.
└── src
    └── samp
        └── HelloMain.java

> cat  src/samp/HelloMain.java 
package samp;
public class HelloMain {
  public static void hello() {
    System.out.println("Hello There");  }}

Clojure 代码:

 > cat project.clj 
(defproject clj "0.1.0-SNAPSHOT"
  :dependencies [
    [org.clojure/clojure "1.9.0-alpha13"]
  ]
  :java-source-paths ["/home/alan/xpr/src"]
  :main ^:skip-aot clj.core
  :target-path "target/%s"
)

> cat test/tst/clj/core.clj
(ns tst.clj.core
  (:use clj.core
        clojure.test )
  (:import [samp.HelloMain])
)

(println "begin" )
(samp.HelloMain/hello)
(println "end" )

至运行:

> lein test
(:repositories detected in user-level profiles! [:user] 
See https://github.com/technomancy/leiningen/wiki/Repeatability)
Compiling 1 source files to /home/alan/clj/target/base+system+user+dev+test+test/classes
begin
Hello There
end

lein test user

Ran 0 tests containing 0 assertions.
0 failures, 0 errors.

因此,clojure 编译器通过 project.clj 中的条目引用了 java 源代码

:java-source-paths ["/home/alan/xpr/src"]

当您 运行 lein test 时,它会将 java 源文件与已编译的 java *.class 缓存的文件进行比较,并重新编译 java 必要时来源。如果我们做出改变

"Hello There" -> "Hello, again!" 在 java 来源中,我们得到:

 > lein test
(:repositories detected in user-level profiles! [:user] 
See https://github.com/technomancy/leiningen/wiki/Repeatability)
Compiling 1 source files to /home/alan/clj/target/base+system+user+dev+test+test/classes
begin
Hello, again!
end

lein test user

Ran 0 tests containing 0 assertions.
0 failures, 0 errors.

因此 lein 检测到源文件更改并重新编译了 java 个源文件。


更新

我有 a template project 混合 Clojure/Java 源代码。 只需克隆它,您就可以参加比赛了!