【发布时间】:2015-03-06 10:13:35
【问题描述】:
我正在使用 Square 的 Dagger v1.0.1 进行依赖注入,我无法让 overrides = true 按预期工作。
我有一个名为 MyGameTestModule.java 的测试提供程序类:
@Module(
includes = { BaseModule.class, NetModule.class},
injects = { MyGame.class, MyManager.class },
overrides = true
)
public class MyGameTestModule {
// ...
@Provides
@Singleton
DummyInterface provideDummyInterface() {
return new DummyInterface() {
@Override
public Bar getBar() {
// return actual Bar
}
};
}
}
我有一个像这样的测试,名为 MyManagerTest.java:
public class MyManagerTest {
@Inject
public MyManager myManager;
// ...
@Before
public void setup() {
ObjectGraph objectGraph = ObjectGraph.create(new TestModule());
objectGraph.inject(this);
}
@Module(
includes = {MyGameTestModule.class},
injects = {MyManagerTest.class},
overrides = true
)
public static class TestModule {
@Provides
@Singleton
DummyInterface provideDummyInterface() {
return new DummyInterface() {
@Override
public Bar getBar() {
// return mocked Bar
}
};
}
}
}
但是当我运行测试时,Dagger 会抛出如下异常:
java.lang.IllegalArgumentException:重复: com.foo.DummyInterface com.foo.MyManagerTest$TestModule.provideDummyInterface() com.foo.DummyInterface com.foo.MyGameTestModule.provideDummyInterface() 在 dagger.internal.UniqueMap.put(UniqueMap.java:29) 在 dagger.internal.plugins.reflect.ReflectiveModuleAdapter.handleBindings(ReflectiveModuleAdapter.java:104) 在 dagger.internal.plugins.reflect.ReflectiveModuleAdapter.getBindings(ReflectiveModuleAdapter.java:89) 在 dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:174) 在 dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:132) 在 dagger.ObjectGraph.create(ObjectGraph.java:129) 在 com.foo.MyManagerTest.setup(MyManagerTest.java:38)
我错过了什么吗?难道不应该用 "overrides = true" 提供给 Module 来覆盖 MyGameTestModule 中的 DummyInterface 吗?
提前致谢。
【问题讨论】:
-
你为什么使用 1.0.1?那里有1.2.2,也许这个版本解决了问题。
-
我尝试了 1.2.2,但不得不处理一堆不同类型的问题。我只是想知道我使用 overrides=true 的方式是否有问题
标签: java testing dependency-injection mockito dagger