= Meecrowave Testing :jbake-date: 2016-10-24 :jbake-type: page :jbake-status: published :jbake-meecrowavepdf: :jbake-meecrowavetitleicon: icon icon_puzzle_alt :jbake-meecrowavecolor: body-blue :icons: font == JUnit Coordinates: [source,xml] ---- org.apache.meecrowave meecrowave-junit ${meecrowave.version} ---- === Rules and Runners Meecrowave provides two flavors of JUnit integration: standalone or runners/rules. The standalone one will ensure there is a single container for the whole JVM. It also fits standalone environments where you want to control the lifecycle. The other one will follow the JUnit lifecycle (per class or test rule). Here how to use the standalone flavor: [source,java] ---- @RunWith(MonoMeecrowave.Runner.class) public class MonoMeecrowaveRuleTest { /* or @ClassRule public static final MonoMeecrowave.Rule RULE = new MonoMeecrowave.Rule(); */ @MonoMeecrowave.Runner.ConfigurationInject private Meecrowave.Builder config; @Test public void test() throws IOException { // use "http://localhost:" + config.getHttpPort() } } ---- When using the standalone, `@MonoMeecrowave.Runner.ConfigurationInject` allows to still access the configuration and random HTTP port. For the configuration, the standalone runner will use a global configuration shared by all tests. To load it it will use a standard `ServiceLoader` on type `org.apache.meecrowave.Meecrowave$ConfigurationCustomizer`. And here is the one bound to the JUnit lifecycle [source,java] ---- public class MeecrowaveRuleTest { @ClassRule // started once for the class, @Rule would be per method public static final MeecrowaveRule RULE = new MeecrowaveRule(); @Test public void test() throws IOException { // use "http://localhost:" + RULE.getConfiguration().getHttpPort() } } ---- As usual with JUnit rules, you can decide whereas the Meecrowave instance is bound to the entire test class or a method by using @ClassRule or @Rule. === JUnit 5 JUnit 5 integrates a new `Extension` system. It is not yet very well supported by IDEs but you can already use it with Gradle and Maven (see http://junit.org/junit5/docs/current/user-guide/#running-tests). The usage has two annotations: `@MeecrowaveConfig` which remaps most of the configuration of Meecrowave and `@MonoMeecrowaveConfig` which is close to `MonoMeecrowave.Runner` in term of usage. [source,java] ---- @MeecrowaveConfig /*(some config)*/ public class MeecrowaveConfigTest { @ConfigurationInject private Meecrowave.Builder config; @Test public void run() throws MalformedURLException { final String base = "http://localhost:" + config.getHttpPort(); // asserts } } ---- Or [source,java] ---- @MonoMeecrowaveConfig public class MeecrowaveConfigTest { // ... } ---- == Arquillian Container Container dependency: [source,xml] ---- org.apache.meecrowave meecrowave-arquillian ${meecrowave.version} ---- For the configuration check link:{context_rootpath}/meecrowave-core/configuration.html[Core configuration]. Here is a sample: [source,xml] ---- include::../../../../../target/generated-doc/ArquillianConfiguration.adoc[] ----