我正在尝试使用 Dagger 注入(inject)服务 TelephonyManager
。我正在关注这个 sample .我扩展了 Application
类来创建图形,并定义了一个 ApplicationModule
,其中包含 ServiceModule
,将来还会包含其他模块。
编辑:
现在,系统服务已毫无问题地注入(inject)到 Activity
中。我在 Activity
中丢失了 FinderApplication.inject(this)
。它有一个注入(inject),但在使用 Robolectric
测试时仍然没有注入(inject)。我在这篇文章的底部添加了测试用例:
编辑 2:
ApplicationModule
删除并创建了 BaseActivity
:
((FinderApplication) getApplication()).getGraph().inject(this);
在 onCreate
方法上。我得到的错误是:
Caused by: java.lang.NoSuchMethodException: ServiceModule.()
但是如果我定义一个空的构造函数,当需要注入(inject)的类时我会得到一个空指针。
FinderApplication.java
public class FinderApplication extends Application {
private ObjectGraph mObjectGraph;
@Override
public final void onCreate() {
super.onCreate();
mObjectGraph = ObjectGraph.create(new ServiceModule(this));
}
public final ObjectGraph getGraph() {
return mObjectGraph;
}
}
ServiceModule.java
@Module(entryPoints = { SimCardActivity.class, SimService.class })
public class ServiceModule {
private Context mContext;
public ServiceModule(Context context) {
mContext = context;
}
@Provides @Singleton
TelephonyManager provideTelephonyManager(){
return (TelephonyManager) mContext
.getSystemService(Context.TELEPHONY_SERVICE);
}
}
SimCardActivityTest.java
@RunWith(RobolectricTestRunner.class)
public class SimCardActivityTest {
@Before
public void setUp() throws Exception {
ObjectGraph.create(new TestModule()).inject(this);;
}
@Module(
includes = ServiceModule.class,
overrides = true,
entryPoints = {SimCardActivityTest.class, SimCardActivity.class}
)
static class TestModule{
public static TelephonyManager TELEPHONY_MANAGER =
Mockito.mock(TelephonyManager.class);
@Provides @Singleton
TelephonyManager provideTelephonyManager(){
return TELEPHONY_MANAGER;
}
}
}
最佳答案
正如@AndyDennie 在他的评论中所说,我没有在测试课上进行注入(inject)。注入(inject)被测 Activity 而不是在 setUp()
上创建它解决了问题。
我当前的测试用例(相关代码)如下所示:
@RunWith(RobolectricTestRunner.class)
public class SimCardActivityTest {
@Inject
private SimCardActivity mActivity;
private TelephonyManager mTelephonyManager;
@Before
public void setUp() throws Exception {
ObjectGraph.create(new ServiceModule(Robolectric.application),
new ServiceTestModule()).inject(this);
}
@Module(
includes = {ServiceModule.class },
overrides = true,
entryPoints = {SimCardActivity.class, SimCardActivityTest.class}
)
static class ServiceTestModule {
public static TelephonyManager TELEPHONY_MANAGER =
Mockito.mock(TelephonyManager.class);
@Provides
@Singleton
TelephonyManager provideTelephonyManager(){
return TELEPHONY_MANAGER;
}
}
}
关于android - 使用 Dagger 和 Robolectric 注入(inject)服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15257695/