Tôi tìm thấy một cách để sử dụng Dagger với ActivityInstrumentationTestCase2
bởi lười biếng tạo Graph Object. Những gì tôi làm là chờ để tạo đồ thị đối tượng cho đến khi lần đầu tiên một lớp muốn được tiêm, miễn là bạn thêm mô-đun trước khi gọi getActivity()
(bắt đầu vòng đời hoạt động cho hoạt động đang thử nghiệm) và sử dụng overrides = true
trong mô-đun thử nghiệm, điều này sẽ hoạt động. Dưới đây là các lớp và đoạn mã có liên quan:
GraphHolder
, như tên ngụ ý, giữ đối tượng ObjectGraph
cho chúng tôi. Chúng tôi sẽ thực hiện tất cả các cuộc gọi đến lớp này thay vì trực tiếp đến 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;
}
}
Chúng tôi sẽ thêm các module của chúng tôi trong lớp Application
:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
GraphHolder.getInstance().addModules(getModules());
}
Object[] getModules() {
return new Object[]{
// your modules here
};
}
}
Bên trong lớp chúng tôi muốn tiêm, chúng tôi sẽ chỉ cần gọi GraphHolder.getInstance().inject(this)
hơn ObjectGraph.inject(this)
Trong module thử nghiệm của chúng tôi , chúng tôi sẽ cung cấp các đối tượng mà chúng tôi muốn ghi đè để thử nghiệm và thêm overrides = true
vào chú thích @Module
. Điều này cho đồ thị đối tượng thích các nhà cung cấp mô-đun này hơn những người khác nếu có xung đột.
Sau đó, trong các thử nghiệm của chúng tôi:
@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
}
Vì vậy, nó không phải dễ dàng để xem ở đây những gì đang xảy ra, bởi vì chúng ta không thấy những gì bạn đang tiêm vào thử nghiệm, vv Bạn có thể cắt và cung cấp một ví dụ đơn giản về các mô-đun sản xuất và thử nghiệm của bạn, sao chép vấn đề này? –
Có lẽ câu trả lời của tôi trong bài đăng liên quan này sẽ giúp bạn: http://stackoverflow.com/questions/15630589/android-functional-testing-with-dagger?rq=1 – IIIRepublica