Meecrowave Testing

JUnit

Coordinates:

<dependency>
  <groupId>org.apache.meecrowave</groupId>
  <artifactId>meecrowave-junit</artifactId>
  <version>${meecrowave.version}</version>
</dependency>

Rules and Runners

Meecrowave provides two flavors of JUnit integration: mono or nor runners/rules. The mono one will ensure there is a single container for the whole JVM where the other ones will follow JUnit lifecycle (per class or test).

Here how to use the not mono rule:

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()
    }
}

And here for the mono version:

@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 mono runner, @MonoMeecrowave.Runner.ConfigurationInject allows to still access the configuration and random HTTP port.

For the configuration, mono rule 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.

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.

@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

@MonoMeecrowaveConfig
public class MeecrowaveConfigTest {
    // ...
}

Arquillian Container

Container dependency:

<dependency>
  <groupId>org.apache.meecrowave</groupId>
  <artifactId>meecrowave-arquillian</artifactId>
  <version>${meecrowave.version}</version>
</dependency>

For the configuration check Core configuration.

Here is a sample:

<?xml version="1.0" encoding="UTF-8"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
  <container qualifier="tomee-embedded" default="true">
    <configuration>
      <property name="arquillianProtocol">Servlet 3.1</property>
      <property name="cdiConversation">false</property>
      <property name="clientAuth"></property>
      <property name="conf"></property>
      <property name="cxfServletParams">
        hide-service-list-page=true
      </property>
      <property name="deleteBaseOnStartup">true</property>
      <property name="dir"></property>
      <property name="host">localhost</property>
      <property name="http2">false</property>
      <property name="httpPort">-1</property>
      <property name="httpsPort">8443</property>
      <property name="injectServletContainerInitializer">true</property>
      <property name="java9SkipWorkarounds">false</property>
      <property name="jaxrsDefaultProviders"></property>
      <property name="jaxrsLogProviders">false</property>
      <property name="jaxrsMapping">/*</property>
      <property name="jaxrsProviderSetup">true</property>
      <property name="jsonbBinaryStrategy"></property>
      <property name="jsonbEncoding">UTF-8</property>
      <property name="jsonbIJson">false</property>
      <property name="jsonbNamingStrategy"></property>
      <property name="jsonbNulls">false</property>
      <property name="jsonbOrderStrategy"></property>
      <property name="jsonbPrettify">false</property>
      <property name="jsonpBufferStrategy">QUEUE</property>
      <property name="jsonpMaxReadBufferLen">65536</property>
      <property name="jsonpMaxStringLen">10485760</property>
      <property name="jsonpMaxWriteBufferLen">65536</property>
      <property name="jsonpPrettify">false</property>
      <property name="jsonpSupportsComment">false</property>
      <property name="keepServerXmlAsThis">false</property>
      <property name="keyAlias"></property>
      <property name="keystoreFile"></property>
      <property name="keystorePass"></property>
      <property name="keystoreType">JKS</property>
      <property name="loggingGlobalSetup">true</property>
      <property name="loginConfig">authMethod=BASIC;realmName=app</property>
      <property name="properties">
        jpa.property.openjpa.RuntimeUnenhancedClasses=supported
        jpa.property.openjpa.jdbc.SynchronizeMappings=buildSchema
      </property>
      <property name="quickSession">true</property>
      <property name="realm">org.apache.catalina.realm.JAASRealm:configFile=jaas.config;appName=app</property>
      <property name="roles">
        admin=admin
        limited=admin,other
      </property>
      <property name="scanningExcludes"></property>
      <property name="scanningIncludes"></property>
      <property name="scanningPackageExcludes"></property>
      <property name="scanningPackageIncludes"></property>
      <property name="securityConstraints">collection=sc1:/api/*:POST;authRole=**|collection=sc2:/priv/*:GET;authRole=*</property>
      <property name="serverXml"></property>
      <property name="sharedLibraries"></property>
      <property name="skipHttp">false</property>
      <property name="ssl">false</property>
      <property name="sslProtocol"></property>
      <property name="stopPort">-1</property>
      <property name="tempDir">/tmp/meecrowave_85408842417852</property>
      <property name="tomcatAccessLogPattern"></property>
      <property name="tomcatAutoSetup">true</property>
      <property name="tomcatFilter"></property>
      <property name="tomcatNoJmx">true</property>
      <property name="tomcatScanning">true</property>
      <property name="tomcatWrapLoader">true</property>
      <property name="useLog4j2JulLogManager">true</property>
      <property name="useShutdownHook">false</property>
      <property name="useTomcatDefaults">true</property>
      <property name="users">
        admin=adminpwd
        other=secret
      </property>
      <property name="webResourceCached">true</property>
      <property name="webXml"></property>
    </configuration>
  </container>
</arquillian>