2014-11-03 42 views
5

如何在大项目中测试Guice AbstractModule的实现而不创建假实现?有没有可能测试bind()和inject()方法?如何测试Guice AbstractModule的实现?

+3

你不想测试框架,所以只要相信绑定和注入的guice工作正常。 如果你想测试你的模块实现,看看Modules.overwrite,你可以保留你的生产模块并覆盖足够的假/模拟的东西,所以你仍然可以很容易地对它们进行单元测试。 – 2014-11-03 19:37:35

回答

4

通常,测试Guice模块的最佳方法是在测试中创建一个注入器,并确保您可以获取您关心的密钥实例。

要做到这一点,而不会导致生产的东西发生你可能需要用其他模块替换一些模块。您可以使用Modules.override选择性地覆盖单个绑定,但通常最好不要安装“生产”类型的模块并使用伪装绑定。

由于Guice 4.0有帮助类BoundFieldModule,可以帮助这一点。我经常设置如下测试:

public final class MyModuleTest { 
    @Bind @Mock DatabaseConnection dbConnection; 
    @Bind @Mock SomeOtherDependency someOtherDependency; 

    @Inject Provider<MyThing> myThingProvider; 

    @Before public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    Guice.createInjector(new MyModule(), BoundFieldModule.of(this)) 
     .injectMembers(this); 
    } 

    @Test public void testCanInjectMyThing() { 
    myThingProvider.get(); 
    } 
} 

Guice wiki上还有更多documentation for BoundFieldModule

+0

谢谢你的回答。对不起,但我无法解析** BoundFieldModule **类和** @ Bind **注释。 – Nikolas 2014-11-10 07:47:15

+1

@Nikolas:你可以通过在你的测试中创建一个匿名的'AbstractModule'子类来做同样的事情,当然''BoundFieldModule'只是一个快捷方式。 (如果你的项目中没有,你可能想将Guice升级到最新版本。)答案的重要部分是确保你的依赖关系正确的最好方法是在测试中创建一个'Injector',并验证它是否按预期工作。 – 2014-11-10 19:18:32