1

我有一个 Maven 项目javaruntime和一个androidruntime依赖于该项目的 Mavenjavaruntime项目。每个项目都有一个将一些类绑定到接口的 Guice-Module。

其中javaruntime是一个接口IElementFactory和一个类C,它IElementFactory通过构造函数注入获得:

public class C {
    @Inject
    public C(IElementFactory factory, ...(other interfaces)...) {...}
    // ...
}

的具体实现IElementFactoryandroidruntime项目中并称为AndroidElementFactory. 其他接口的所有实现都在javaruntime.

javaruntime我有 JUnit-tests 应该使用 aMockElementFactory因为它不知道androidruntime.

如果我将 绑定IElementFactrory到模块中的AndroidElementFactory唯一,测试当然会失败,因为模块/项目androidruntime中没有为该接口绑定任何实现。javaruntime

如果我然后MockElementFactoryjavaruntime模块中绑定测试很好,但是我无法编译androidruntime因为 IElementFactory 已经绑定到MockElementFactory并且覆盖绑定是不好的并且在 Guice 中不推荐。

但是我怎样才能实现将 Mock 用于测试并且在 android-project 中仍然可以绑定正确的实现?

4

1 回答 1

5

首先,事实上你不想这样做。当你对你的类进行单元测试时,尤其是使用模拟时,你不应该使用 Guice。相反,您应该直接实例化您的类,并为其提供所有依赖项。由于您正在编写单元测试,这应该不是问题,因为它在测试中的所有依赖项都应该是微不足道的或被嘲笑的。

但是如果你真的想做你想做的事,你必须把你的程序分成几个模块。为简单起见,让它们为MainModule和。在您配置除. 它看起来像这样:MockModuleAndroidModuleMainModuleIElementFactory

public class MainModule extends AbstractModule {
    @Override
    protected void configure() {
        // Require presence of IElementFactory
        requireBinding(IElementFactory.class);

        // Bind all other dependencies
        ...
    }
}

并在你MockModuleAndroidModule你绑定相应的实现IElementFactory

然后在您的测试中,您可以像这样创建注入器:

Injector injector = Guice.createInjector(new MainModule(), new MockModule());

在 android 项目中,您可以像这样创建它:

Injector injector = Guice.createInjector(new MainModule(), new AndroidModule());

如果你因为注入器实例化是硬编码而无法做到这一点,那么你真的应该考虑重构你的程序,因为这不是 Guice 项目的结构,尤其是 wrt。单元测试。我不能说更多,因为您还没有解释程序的确切结构。

于 2013-06-14T05:53:35.640 回答