簡體   English   中英

使用Dagger進行Android功能測試

[英]Android functional testing with Dagger

我正在嘗試用Mockito和Dagger測試一項活動。 我已經能夠在我的應用程序中為Activity注入依賴項,但在測試Activity時,我無法向Activity注入mock。 我應該注入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; 后一個超類調用onStart()生命周期方法的Activity阻塞你注入你的測試雙打依賴關系,但是用第一個超類你可以處理更細粒度的生命周期。

您可以使用dagger-1.0.0和mockito查看我的工作示例,用於測試活動和片段:

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

被測項目在:

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

希望這對你有所幫助

我做了一些實驗,發現Dagger在注入測試時無法正確創建活動。 在新版本的測試中,testDoSomethingCalledOnEngine通過,但未在MainActivity上調用onCreate。 第二個測試,testDoSomethingUI失敗,實際上有兩個MainActivity實例,onCreate被調用到另一個實例(由ActivityInstrumentationTestCase2創建),但不是另一個實例。 也許Square的開發人員只考慮使用Robolectric而不是Android儀器測試來測試Activites

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"));  
}

}

我已將所有內容放在一起並制作演示應用程序,演示如何使用匕首進行測試: https//github.com/vovkab/dagger-unit-test

以下是我更詳細的透露答案:
https://stackoverflow.com/a/24393265/369348

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM