In JUnit 5, you use the junitlauncher Ant task rather than the junit Ant task. Unfortunately, this isn’t a drop in replacement. For example, junitlauncher doesn’t offer the option to fork and run the JUnit tests. As a result, it also doesn’t have the nested sysproperty tag so you can pass system properties. This is a problem.
For the CodeRanch, we set a system property for the default file encoding. Since developers are around the world, we can’t assume everyone “just has” the encoding set.
Since JUnit 5 functionality for Ant was introduced this year, I’m hoping what I did in this post is a short term workaround.
Option 1 – pass to Ant
You can pass the the properties to Ant itself as described on Stack Overflow. For example:
- subpar – all the developers need to remember to do this. The reason we had it in Ant in the first place is so folks wouldn’t need to remember
- for some use cases, the desired system properties could be derived and not know when calling Ant
Option 2- Nashorn Code
Since JUnit 5 is being run in the same process as Ant itself, you need to set the system property in memory. Luckily, Ant allows you to run scripting in various languages. I chose Nashorn because it is built into Java. (There are other variants of this; see below)
- Short and simple
- Nashorn is deprecated for removal starting Java 11. This means at some point, it can be removed. (I’m hopeful that the Ant task itself will support system properties by then.
- Requires Java 8 or higher
- The System property is set for the remainder of the build (you could write another code block to null it out after the test if this is a problem)
Variants of option 2
If you are running Ant with a version of Java below Java 8, you could use this technique, but use Rhino instead. I didn’t test this, but I think the code is importClass(java.lang.System); System.setProperty('file.encoding', 'ISO8859_1')
JUnit 5 itself uses Java 8 so nobody would be in the situation of pre-Java 8 and trying to use this blog post.
If you are running Ant with a version of Java where Nashorn has been removed, you could use Groovy or Jython as the embedded language. The code is simpler. I didn’t chose this because it requires adding another jar to the Ant directory. I prefer to minimize these set up extensions. Especially for a feature like this which is likely to be temporary.System.setProperty('file.encoding', 'ISO8859_1')
There’s also an option to add a JUnit extension to set it, but that would require updating each class.
Pingback: Java Annotated Monthly – September 2018 | IntelliJ IDEA Blog