I'm creating a library that includes both Clojure and Java code, and would like to be able to run a single test JUnit suite across the entire code base. Seems that this should be possible since they are both running on the JVM and there is good Clojure/Java interop.
However, currently Clojure code seems to favour unit testing done through the clojure.test API using "(run-all-tests)" and friends.
Is there a good way to wrap these Clojure tests in some sort of wrapper so that they can be automatically called from JUnit?
(when I say automatically, I mean without resorting to the manual solution of writing a JUnit test case to wrap and call each Clojure test case individually :-) )
The easiest thing to do would be to call run-all-tests
from a single JUnit test. You could capture the output and look at the last line that indicates the pass/fail/error count. If you see a fail or an error you can make the JUnit test fail.
However, if you want interaction with each Clojure test you'll have to implement similar functionality to what's found in clojure.test. That is, for each value in the each namespace look for a function stored in the :test
meta-data value. That value is your test function.
Lines 661-686 of test.clj give a good synopsis of how tests are stored and later run in Clojure.
Currently there exists no JUnit integration I know of. Besides calling run-all-tests from a single JUnit test as suggested by @psyllo you can build more thorough integration as follows:
junit.framework.Test
for every test method defined in clojure. Have a look at clojure.test/test-ns
on how to find all test methods. junit.framework.TestSuite
which adds all those generated Tests for a certain ns and AOT compile this suite class.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With