android - 使用 Dagger 和 Robolectric 注入(inject)服务

标签 android dependency-injection robolectric dagger

我正在尝试使用 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/

相关文章:

dependency-injection - RazorEngine v3 依赖注入(inject)

使用 Lombok 和 Guice 注入(inject)进行 Java 链继承

android - 如何使用 robolectric 对 android 录音应用程序进行单元测试

android - TestNG Android 单元测试, stub !异常(exception)

java - 尝试将 AndroidJUnit4 与标准 JUnit 运行器和委托(delegate)运行器一起使用 'org.robolectric.RobolectricTestRunner' 无法加载

javascript - deviceready 未在phonegap中触发

android - 蓝牙Gatt : onClientConnectionState() returns status=133

android - 使用xml内容实现android可扩展通知?

php - 使用 Symfony 检查 Controller 内是否处于 "dev"模式

android - 在设备上调试 sqlite 数据库