繁体   English   中英

简单的匕首单元测试失败

[英]simple dagger unit test fails

我是匕首的新手。 我创建了一个非常简单的单元测试,以尝试了解如何使用匕首。 不幸的是它失败了。 我可能还不了解匕首的一些基本原理。

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());
    }
}

我以为dagger会将B注入A中,因为A希望将其注入并且DaggerModule包含一个@Provides带注释的方法,该方法创建了B。

更新:

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

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

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

@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中有一个接受B的构造函数或设置器,这正是我认为可以通过使用Dagger避免的开销。

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

我注意到行为完全相同,即@Provides产生的实例未注入其@Inject标记成员。 cf 匕首和嵌套式注射

我做的和您完全一样:使用@Provides参数注入转发到构造函数(没有相同的印象,这有点像击败dagger的目的)。 我会在有空余时间的情况下,尝试使用匕首深入了解这是否是正常现象。

如果使A类成为您的模块的入口点,则比匕首会将依赖项B注入A。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM