【问题标题】:Dagger does not override module as expectedDagger 没有按预期覆盖模块
【发布时间】: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


【解决方案1】:

TestModule 中使用addsTo 代替includes

@Module(
    addsTo = {MyGameTestModule.class}, 
    injects = {MyManagerTest.class}, 
    overrides = true
)
public static class TestModule {
}

并使用MyGameTestModuleTestModule 创建ObjectGraph

ObjectGraph.create(new MyGameTestModule(), new TestModule());

【讨论】:

  • 我试过这个,但是 dagger 一直抛出 duplicate 异常。
  • 刚刚注意到您在 MyGameTestModule 类中有 overrides = true。你真的需要那个吗?因为匕首模块只能被覆盖一次。顺便说一句,它实际上并不是覆盖,而是阴影。
猜你喜欢
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多