与匕首的Android功能测试(Android functional testing with Da

2019-08-18 00:53发布

我试图用测试及的Mockito的活动匕首 。 我已经能够在我的应用注入依赖到活动,但测试活动的时候,我一直没能注入模拟的活动。 我应该注入活动测试或让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);
}
}

Answer 1:

我用和的Mockito匕首功能测试。 关键的概念是,你的测试类从ActivityUnitTestCase,而不是ActivityInstrumentationTestCase2继承; 后者超一流呼叫在onStart()活动阻止你注入你的测试生命周期方法双打的相关性,但首超类,你可以处理生命周期更细粒度的。

您可以使用匕首1.0.0和对的Mockito测试活动和片段中看到我的工作的例子:

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

测试项目是:

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

希望这可以帮助你



Answer 2:

我做了一些更多的实验和发现,当它被注入测试匕首是不是能够正确地创建活动。 在测试新版本,testDoSomethingCalledOnEngine通过但的onCreate不叫上在MainActivity。 第二个测试,testDoSomethingUI失败,居然有MainActivity的两个实例,的onCreate被调用到另一个实例(由ActivityInstrumentationTestCase2我quess创造),而不是其他。 也许在广场的开发者只想到用测试Activites Robolectric而不是Android的仪器测试?

public class MainActivityTest extends
    ActivityInstrumentationTestCase2<MainActivity> {

@Inject Engine engineMock;
@Inject MainActivity mActivity;

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

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

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


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

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

public void testDoSomethingCalledOnEngine() {
    when(engineMock.isLoggedIn()).thenReturn(true);
    mActivity.onSomethingHappened();
    verify(engineMock).doSomething();
}

@UiThreadTest
public void testDoSomethingUI() {
    when(engineMock.isLoggedIn()).thenReturn(true);
    mActivity.onSomethingHappened();
    Button btn = (Button) mActivity.findViewById(R.id.logoutButton);
    String btnText = btn.getText().toString(); 
    assertTrue(btnText.equals("Log out"));  
}

}



Answer 3:

我已经把一切融合在一起并取得演示程序,说明如何使用匕首进行测试: https://github.com/vovkab/dagger-unit-test

这是我的更多的细节透水答案:
https://stackoverflow.com/a/24393265/369348



文章来源: Android functional testing with Dagger