= Application Composer and Mockito example
:index-group: Testing Techniques
:jbake-type: page
:jbake-status: published

In this example, a REST service will be tested, using Application Composer and Mockito.

http://tomee.apache.org/tomee-8.0/docs/application-composer/index.html[Application Composer] is a testing API for TomEE. It's faster to bootstrap than Arquillian. https://site.mockito.org/[Mockito] is a mocking framework. Both will be used for testing a REST service.

== Example

The REST service example is defined by the following class:

[source,java]
----
@Singleton
@Path("/greeting")
public class GreetingService {

    @Inject
    private Messager messager;

    @GET
    public String message() {
        return messager.message();
    }
}
----

A bean, `messager`, is injected. When a client accesses the resource `GET /greeting`, the content returned to the client will be the result of `messager.message()` method execution.

`Messager` functionality is defined by this interface:

[source,java]
----
public interface Messager {

    String message();
}
----

== Testing the REST service

For testing this REST service, Application Composer will be used in combination with Mockito:

[source,java]
----
@RunWith(ApplicationComposer.class)
public class GreetingServiceTest {

    @Mock
    private Messager messager;

    @Configuration
    public Properties configuration() {
        return new Properties() {{
            setProperty(OpenEjbContainer.OPENEJB_EMBEDDED_REMOTABLE, Boolean.TRUE.toString());
        }};
    }

    @MockInjector
    public Class<?> mockitoInjector() {
        return MockitoInjector.class;
    }

    @Module
    public Class<?>[] app() {
        return new Class<?>[]{GreetingService.class, Messager.class};
    }

    @Test
    public void checkMockIsUsed() throws IOException {
        when(messager.message()).thenReturn("mockito");

        final String message = IO.slurp(new URL("http://localhost:4204/GreetingServiceTest/greeting/"));
        assertEquals("mockito", message);
    }
}
----

We can see the usage and configuration of ApplicationComposer. More information about it can be found http://tomee.apache.org/tomee-8.0/docs/application-composer/index.html[here].
An other interesting annotation is `@MockInjector`. This informs the container started by Application composer that Mockito is used, so mock proprieties will be injected.

The test method stubs the `messager.message()` method, returning the value "mockito". Then, it checks that by accessing `GET greeting`, the retrieved content is "mockito".

Full code example can be found https://github.com/apache/tomee/tree/master/examples/rest-applicationcomposer-mockito[here]. It's a maven project, and the tests can be run by the `mvn clean install` command.
