简单的匕首单元测试失败

问题描述 投票:0回答:2

我是匕首的新手。我创建了一个非常简单的单元测试来试图理解我应该如何使用匕首。不幸的是失败了。我可能不了解匕首的一些基本原则。

public class A {
    @Inject
    public B b;

    public B getB() {
      return b;
    }
}

public class B {
}

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA() {
        return new A();
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

和我的测试类失败了

public class DaggerTest extends TestCase {
    public void testDagger() {
        ObjectGraph theGraph = ObjectGraph.create(new DaggerModule());
        A theA = theGraph.get(A.class);
        assertNotNull(theA.getB());
    }
}

我认为匕首会将B注入A,因为A希望它被注入,而DaggerModule包含一个创建B的@Provides注释方法。

更新:

我发现当我像这样编写模块类时

@Module(injects = { A.class })
public class DaggerModule {
    @Provides
    public B provideB() {
        return new B();
    }
}

将B注入A中起作用。但是我不明白为什么当模块有一个构造A实例的提供注释方法时它不起作用。在这种情况下,注入工作的唯一方法是实际自己编写注入:

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA(B b) {
        A theA =  new A();
        theA.b = b;
        return theA;
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

或者在A中创建一个接受B的构造函数,以便您可以编写

@Module(injects = { A.class, B.class })
public class DaggerModule {
    @Provides
    public A provideA(B b) {
        return new A(b);
    }

    @Provides
    public B provideB() {
         return new B();
    }
}

这种需要在A中使用构造函数或setter接受B只是我认为可以通过使用Dagger避免的开销。

所以我做错了什么或者我误解了匕首的能力?

java android dependency-injection dagger
2个回答
1
投票

我注意到完全相同的行为,即@Provides生成的实例没有注入他们的@Inject标记成员。 cf Dagger & nested injections

我做的与你完全一样:使用@Provides参数注入转发给构造函数(没有相同的印象,它有点击败dagger的目的)。我会尝试更多地潜入匕首,以便在我有一些空余时间的情况下弄清楚这是否是正常行为。


0
投票

如果你使A级成为模块的入口点而不是dagger将依赖性B注入A.

@Module(entryPoints = { A.class })
public class DaggerModule {
    @Provides
    public A provideA() {
        return new A();
    }

    @Provides
    public B provideB() {
         return new B();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.