使用 Dagger 进行 Android 功能测试

标签 android dependency-injection mockito functional-testing dagger

我正在尝试使用 Mockito & Dagger 测试 Activity .我已经能够在我的应用程序中向 Activity 注入(inject)依赖项,但是在测试 Activity 时,我无法向 Activity 注入(inject)模拟。我应该注入(inject) Activity 来测试还是让 getActivity() 创建它?

public class MainActivityTest extends
    ActivityInstrumentationTestCase2<MainActivity> {

@Inject Engine engineMock;
private MainActivity mActivity;
private Button mLogoutBtn;


public MainActivityTest() {
    super(MainActivity.class);
}

@Override
protected void setUp() throws Exception {
    super.setUp();

    // Inject engineMock to test
    ObjectGraph.create(new TestModule()).inject(this);
}

@Override
protected void tearDown() {
    if (mActivity != null)
        mActivity.finish();
}

 @Module(
 includes = MainModule.class,
 entryPoints = MainActivityTest.class,
 overrides = true
 )

static class TestModule {
    @Provides
    @Singleton
    Engine provideEngine() {
        return mock(Engine.class);
    }
}

@UiThreadTest
public void testLogoutButton() {

    when(engineMock.isLoggedIn()).thenReturn(true);

    mActivity = getActivity();
    mLogoutBtn = (Button) mActivity.findViewById(R.id.logoutButton);

    // how to inject engineMock to Activity under test?
    ObjectGraph.create(new TestModule()).inject(this.mActivity);

    assertTrue(mLogoutBtn.isEnabled() == true);
}
}

最佳答案

我使用 Mockito 和 Dagger 进行功能测试。 关键概念是你的测试类继承自ActivityUnitTestCase,而不是ActivityInstrumentationTestCase2;后一个父类(super class)调用 onStart() 的 Activity 生命周期方法会阻止您注入(inject)测试双重依赖项,但使用第一个父类(super class),您可以更细粒度地处理生命周期。

您可以在以下位置查看我使用 dagger-1.0.0 和 mockito 测试 Activity 和 Fragments 的工作示例:

https://github.com/IIIRepublica/android-civicrm-test

被测项目在:

https://github.com/IIIRepublica/android-civicrm

希望对你有帮助

关于使用 Dagger 进行 Android 功能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15630589/

相关文章:

Android检查是否设置了锁屏

angular - 创建已弃用 : from v5 use the new signature Injector. create(options)(弃用)

c# - 属性注入(inject) Action 过滤器

android - Mockito:不调用传递给方法的 Runnable 参数的 Runnable.run()

Mockito错误 "The system cannot find the path specified"

android - 从 SMS 数据库中仅检索特定的 SMS

android - 在图像上绘制以创建动画

java - Android 开发 : Java and C/C++ Compiling Functionality In an Application, 可能吗?

.net - DI 和 JSON.NET

java - 使用 Mockito/PowerMock 验证日志是否已写入