我是Android新手,我正在玩Robolectric进行单元测试。我面临以下问题。
我有一个我想测试的活动。
main activity.Java
public class MainActivity extends ActionBarActivity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {
private NavigationDrawerFragment mNavigationDrawerFragment;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNavigationDrawerFragment = (NavigationDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
}
@Override
public void onNavigationDrawerItemSelected (int position) {
...
}
}
这是测试类:
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTests {
private ActivityController<MainActivity> controller;
private MainActivity activity;
private MainActivity spy;
@Test
public void onCreate_shouldStartNavigationDrawerFragment () {
controller = Robolectric.buildActivity(MainActivity.class);
activity = controller.get();
assertThat(activity).isNotNull();
spy = spy(activity);
spy.onCreate(null);
verify(spy).onCreate(null);
}
}
但我得到以下异常:
java.lang.IllegalStateException: System services not available to Activities before onCreate()
在spy.onCreate(null)
线。
我一直在谷歌搜索几个小时,我已经尝试了几个解决方法(盲目地)没有任何成功。可以请任何人指导我吗?
这就是我的诀窍。在使用窥探活动之前我使用attach()。用Robolectric 3.0测试
private MainActivity spyActivity;
@Before
public void setUp(){
MainActivity activity = Robolectric.buildActivity(MainActivity.class).attach().get();
spyActivity = spy(activity);
spyActivity.onCreate(null);
}
您应该通过Robolectric推动活动生命周期。见:http://robolectric.org/activity-lifecycle/
所以对于你的情况,你可以这样做:
controller = Robolectric.buildActivity(MainActivity.class);
activity = controller.get();
assertThat(activity).isNotNull();
spy = spy(activity);
controller.create();
注意:在使用Robolectric进行测试时监视活动生命周期通常是没有意义的,因为你是驱动它的人,所以你只测试你自己的方法调用执行。
这意味着您必须首先调用onCreate()方法。它必须是第一个被称为方法。
如果有兴趣使用完全相同的控制器,并使用活动的间谍,你可以通过Reflection修改控制器的内部类,检查这个方法:
public static <T extends Activity> T getSpy(ActivityController<T> activityController) {
T spy = spy(activityController.get());
ReflectionHelpers.setField(activityController, "component", spy);
return spy;
}
ReflectionHelper可在Robolectric中获得(在Robolectric 4.2上测试)。然后它被初始化为:
controller = Robolectric.buildActivity(MainActivity.class);
activity = getSpy(controller.get());
希望这可以帮助。