我试图用测试及的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);
}
}
我用和的Mockito匕首功能测试。 关键的概念是,你的测试类从ActivityUnitTestCase,而不是ActivityInstrumentationTestCase2继承; 后者超一流呼叫在onStart()活动阻止你注入你的测试生命周期方法双打的相关性,但首超类,你可以处理生命周期更细粒度的。
您可以使用匕首1.0.0和对的Mockito测试活动和片段中看到我的工作的例子:
https://github.com/IIIRepublica/android-civicrm-test
测试项目是:
https://github.com/IIIRepublica/android-civicrm
希望这可以帮助你
我做了一些更多的实验和发现,当它被注入测试匕首是不是能够正确地创建活动。 在测试新版本,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"));
}
}
我已经把一切融合在一起并取得演示程序,说明如何使用匕首进行测试: https://github.com/vovkab/dagger-unit-test
这是我的更多的细节透水答案:
https://stackoverflow.com/a/24393265/369348