2013-05-11 91 views
0

我是新來的匕首。我創建了一個非常簡單的單元測試,試圖瞭解我應該如何使用匕首。不幸的是失敗了。我可能不瞭解匕首的一些基本原理。簡單的匕首單元測試失敗

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希望它被注入和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(); 
    } 
} 

這需要具有在構造函數或setter一個它接受B爲只是我認爲可以通過避免那種開銷使用匕首。

所以我我做錯了什麼,或者我誤解了匕首的能力?

回答

0

如果你讓A級的模塊比匕首的切入點,將注入dependecy B到A

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

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

從1.0.0版開始,似乎'入口點'已被重新命名爲'入口'。所以我寫了'@Module(injects = {A.class})'但是仍然沒有將B注入到A. – 2013-05-12 05:27:18

+0

根據您的示例代碼,您不需要將B設置爲「注入」。你嘗試過構造函數注入嗎? – ilkinulas 2013-05-12 06:03:44

1

我注意到恰好,即@Provides生產的情況下沒有得到相同的行爲他們注入了@Inject標記的成員。 cf Dagger & nested injections

我的確和你一模一樣:使用@Provides參數注入來轉發給構造函數(沒有相同的印象,它有點擊敗了匕首的目的)。我會盡量多花一點時間去研究匕首,以便儘快有一些空閒時間這是否是一種正常行爲。