设置我使用 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 源代码。
只需克隆它,您就可以参加比赛了!
我必须编写一个纯 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 源代码。 只需克隆它,您就可以参加比赛了!