如何使用带有Assisted Inject的模拟对象而不是真正的实现类

时间:2014-07-07 07:28:02

标签: java unit-testing dependency-injection guice

我有以下抽象类:

  

公共抽象类MyClass

然后我有两个扩展这个的抽象类:

  

公共抽象类AClass扩展了MyClass

  

公共抽象类BClass扩展了MyClass

我必须使用依赖注入来实例化我的对象。扩展类AClassBClass的类的构造函数接收String作为参数,因此我使用来自Google Guice的AssistedInject扩展名。

在我的普通BinderModule中,我有以下代码:

public class BinderModule implements Module{

@Override
public void configure(Binder binder) {
    binder.install(
            new FactoryModuleBuilder().
                    implement(AClass.class, AClassImpl.class).
                    build(AClassFactory.class));

    binder.install(
            new FactoryModuleBuilder().
                    implement(BClass.class, BClassImpl.class).
                    build(BClassFactory.class));
}
}

我还想使用一个模块进行测试,它将模拟Object替换AClassImpl和BClassImpl。

到目前为止,当我使用注射时,我做了类似的事情:

InterfaceA myMockObj = EasyMock.createMock(InterfaceAImpl.class);
binder.bind(InterfaceA.class).toInstance(myMockObj);

问题是现在implement方法只接收Class个参数,我无法将模拟的对象连接到抽象类。

关于如何克服这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

一般情况下,如果你根本不使用Guice,单元测试会更简单。但如果你真的想,你可以像这样嘲笑工厂界面:

BClass myMockObj = EasyMock.createMock(BClass.class);
BClassFactory mockFactory = EasyMock.createMock(BClassFactory.class);
EasyMock.expect(mockFactory.create(arguments)).andStubReturn(myMockObj);
bind(BClassFactory.class).toInstance(mockFactory);

而不是使用辅助注射,这对于模拟不会很好。