Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JUnit and Clojure unit testing

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 :-) )

like image 837
mikera Avatar asked Jan 30 '11 21:01

mikera


2 Answers

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.

like image 81
Psyllo Avatar answered Sep 28 '22 11:09

Psyllo


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:

  1. Build a function that generates an instance of 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.
  2. Make an instance of junit.framework.TestSuite which adds all those generated Tests for a certain ns and AOT compile this suite class.
  3. You can call the suite class from java / junit.
like image 38
ordnungswidrig Avatar answered Sep 28 '22 11:09

ordnungswidrig