입니다. 내가하는 일은 클래스가 주입되기를 원하는 순간까지 Object Graph를 만들기를 기다리는 것입니다. 따라서 getActivity()
(테스트중인 액티비티의 액티비티주기를 시작합니다)을 호출하기 전에 모듈을 추가하고 overrides = true
을 호출하면됩니다. 테스트 모듈,이 작동합니다. 다음은 관련 클래스 및 스 니펫입니다.
GraphHolder
은 이름에서 알 수 있듯이 ObjectGraph
객체를 보유하고 있습니다. 우리는 직접 ObjectGraph
이 아닌이 클래스에 대한 모든 호출을 할 것입니다.
public class GraphHolder {
private static GraphHolder sInstance;
private Object[] mModules;
private ObjectGraph mGraph;
private GraphHolder() {
}
public static GraphHolder getInstance() {
if (sInstance == null) {
sInstance = new GraphHolder();
}
return sInstance;
}
public void inject(Object object) {
if (mGraph == null) {
create();
}
mGraph.inject(object);
}
public <T> T get(Class<T> type) {
if (mGraph == null) {
create();
}
return mGraph.get(type);
}
public void addModules(Object... modules) {
if (mGraph != null) {
mGraph.plus(modules);
} else {
if (mModules == null) {
mModules = modules;
} else {
mModules = concatenate(mModules, modules);
}
}
}
private void create() {
mGraph = ObjectGraph.create(mModules);
mModules = null;
}
private Object[] concatenate(Object[] a, Object[] b) {
int aLength = a.length;
int bLength = b.length;
Object[] c = new Object[aLength + bLength];
System.arraycopy(a, 0, c, 0, aLength);
System.arraycopy(b, 0, c, aLength, bLength);
return c;
}
}
우리는 Application
클래스에서 우리의 모듈을 추가 할 것입니다 :
우리가 주입하고자하는 클래스 내부
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
GraphHolder.getInstance().addModules(getModules());
}
Object[] getModules() {
return new Object[]{
// your modules here
};
}
}
, 우리는 단순히 우리의 테스트 모듈에서 ObjectGraph.inject(this)
보다는 GraphHolder.getInstance().inject(this)
전화 할게 테스트를 위해 재정의하려는 객체를 제공하고 overrides = true
을 @Module
주석에 추가합니다. 이것은 충돌이있는 경우 다른 사람들보다이 모듈의 제공자를 선호하는 객체 그래프를 알려줍니다.
그런 다음, 우리의 테스트에서 :
@Inject Foo mFoo;
@Override
public void setUp() {
super.setUp();
GraphHolder.getInstance().addModules(new TestFooModule());
GraphHolder.getInstance().inject(this); // This is when the object graph will be created
}
그래서 당신은 트림 및 제공 할 수 있습니다 등, 우리는 당신이 시험에 주입하는지 볼 수 없기 때문에, 여기에 무슨 일이 일어나고 있는지 볼 쉬운 일이 아닙니다 이 문제를 재현하는 생산 및 테스트 모듈의 간단한 예? –
아마이 관련 게시물에 내 대답은 당신을 도와줍니다 : http://stackoverflow.com/questions/15630589/android-functional-testing-with-dagger?rq=1 당신이에서 활동에 주입 할 수 – IIIRepublica