With the installment of AS 7 we have a perfect runtime implementation for a modular environment in the form of jboss-modules.
Now I also want it to be usable from within an IDE (in this case Intellij) and Maven (our current build tool). So I figured that through the use of a JUnit Runner I could setup a moduler enviroment (similar to Arquillian).
First you'll have to pickup a piece of experimental code I call jboss-modules-junit at https://github.com/wolfc/jboss-modules-junit.
Now you can start to run your test case within a modular environment simply by saying @RunWith(Modules.class).
@RunWith(Modules.class)
public class MyTestCase {
By default Modules will take the test class name as the module name. This can be overriden with @ModuleName.
@ModuleName("org.jboss.as.test.surefire.servermodule")
First you'll need a module.xml file to represent your test module. By default the modules runner will look it up on your class path entry of your test class.
<?xml version="1.0" encoding="UTF-8"?><module xmlns="urn:jboss:module:1.0" name="org.jboss.modules.junit.SimpleTestCase">
<resources>
<!-- a trick to add the original class path entry -->
<resource-root path="../../../../../.."/>
</resources>
<dependencies>
<module name="junit"/>
<module name="org.jboss.logmanager"/>
</dependencies>
</module>
Because you share JUnit with whoever is running the test (IDE or build tool) you need to define a junit module as such. Currently this is a manual requirement.
<?xml version="1.0" encoding="UTF-8"?><module xmlns="urn:jboss:module:1.0" name="junit">
<dependencies>
<module name="system" export="false">
<exports>
<include-set>
<path name="junit/framework"/>
<path name="org/junit"/>
</include-set>
</exports>
</module>
</dependencies>
</module>
https://github.com/wolfc/jboss-modules-junit/blob/master/src/test/resources/junit/main/module.xml
So I bring it all together on our main project, AS 7, https://github.com/wolfc/jboss-as/blob/JBAS-9020-test/testsuite/smoke/src/test/java/org/jboss/as/test/surefire/servermodule/ServerInModuleDeploymentTestCase.java. You can try it for yourself by using https://github.com/wolfc/jboss-as/tree/JBAS-9020-test. Additional VM parameters are required though:
- -Djboss.home.dir=/home/carlo/work/jboss-as/build/target/jboss-7.0.0.Beta4-SNAPSHOT (mandatory)
- -Dmodule.path=target/test-classes/modules:/home/carlo/work/jboss-as/build/target/jboss-7.0.0.Beta4-SNAPSHOT/modules (override module repos)
- -Djava.util.logging.manager=org.jboss.logmanager.LogManager (because of Intellij bug, see below)
- -Djboss.embedded.root=target/temp-config (to instruct AS Embedded to make a copy)
Some caveats though:
- Intellij contains a bug which initializes a JUnit test case class too soon (http://youtrack.jetbrains.net/issue/IDEA-68658 fixed in 108.13)
- Maven and Intellij disagree in which directory to start the test, so you have to explicitly specify $MODULE_DIR$ as the Working directory in the Run Configuration.