[英]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.