我是新來的匕首。我創建了一個非常簡單的單元測試,試圖瞭解我應該如何使用匕首。不幸的是失敗了。我可能不瞭解匕首的一些基本原理。簡單的匕首單元測試失敗
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爲只是我認爲可以通過避免那種開銷使用匕首。
所以我我做錯了什麼,或者我誤解了匕首的能力?
從1.0.0版開始,似乎'入口點'已被重新命名爲'入口'。所以我寫了'@Module(injects = {A.class})'但是仍然沒有將B注入到A. – 2013-05-12 05:27:18
根據您的示例代碼,您不需要將B設置爲「注入」。你嘗試過構造函數注入嗎? – ilkinulas 2013-05-12 06:03:44