Guice integration!

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

@org.nnsoft.guice.junice.annotation.GuiceModule is a class annotation usefull to indicate a list of google-guice modules class.

@org.nnsoft.guice.junice.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(JUniceRunner.class)
@GuiceModules(modules={ 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));
    }

}
@RunWith(JUniceRunner.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(JUniceRunner.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());
    }

}