2016/02/07 - Apache Onami has been retired.

For more information, please explore the Attic.

Guice integration!

Apache Onami-Test provides a couple of annotations to allow user reusing google-guice modules in test classes.

@org.apache.onami.test.annotation.GuiceModule is a class annotation useful to indicate a list of google-guice modules class.

@org.apache.onami.test.annotation.GuiceProvidedModules is a method annotation usefull to indicate a provider method to create a custom google-guice module.

GuiceModule annotation

This example shows a typical use for this annotation; given the following module:

public class SimpleModule
    extends AbstractModule
{

    @Override
    protected void configure()
    {
        bind( Hello.class ).to( HelloWorld.class );
    }

}

then users can reuse it specifying

@RunWith( OnamiRunner.class )
@GuiceModules( { SimpleModule.class, AnotherAcmeModule.class } )
public class SimpleTest
{

    @com.google.inject.Inject
    private Hello helloWorld;

    @org.junit.Test
    public void testInjectNotStatic()
    {
        assertNotNull( helloWorld );
        assertEquals( "Hello World!!!!", helloWorld.sayHallo() );
    }

}

GuiceProvidedModule annotation

GuiceProvidedModule is usefull when your test needs a module that not have a default costructor. So in you testcase you have to declare a public static method with the return type is com.google.inject.Module or Iterable<com.google.inject.Module> or or com.google.inject.Module[]

public class ComplexModule
    extends AbstractModule
{

    private String name;

    public ComplexModule(String name) {
        this.name = name;
    }

    @Override
    protected void configure() {
        bind( WhoIm.class ).toInstance( new WhoIm(name) );
    }

}

then, in the test class:

@RunWith( OnamiRunner.class )
public class SimpleTest
{

    @GuiceProvidedModules
    public static Module createComplexModule()
    {
        return new ComplexModule( "Marco Speranza" );
    }

    @com.google.inject.Inject
    public static WhoIm whoIm;

    @org.junit.Test
    public void testWhoIm()
    {
        assertNotNull( whoIm );
        assertEquals( "Marco Speranza", whoIm.sayWhoIm() );
    }

}

Finally if you want create a module on the fly, your test case should extend com.google.inject.AbstractModule or implement a com.google.inject.Module

@RunWith( OnamiRunner.class )
public class SimpleTest
    extends AbstractModule
{

    @Override
    public void configure()
    {
        bind( Integer.class ).annotatedWith( Names.named("version") ).toInstance( 10 );
    }

    @Inject
    @Named( "version" )
    private Integer version;

    @Test
    public void testInjectModuleClass()
    {
        assertNotNull( version );
        assertEquals( 10, version.intValue() );
    }

}