使用Robolectric时如何监视Activity

时间:2015-05-25 18:58:57

标签: java android unit-testing android-testing robolectric

我是Android新手,我正在玩Robolectric进行单元测试。 我面临以下问题。

我有一项我想测试的活动。

MainActivity.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)

我一直在谷歌搜索几个小时,我已经尝试了几个解决方法(盲目地)没有任何成功。可以请任何人指导我吗?

4 个答案:

答案 0 :(得分:2)

这就是我的诀窍。在使用窥探活动之前我使用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);

}

答案 1 :(得分:1)

您应该通过Robolectric推动活动生命周期。 请参阅:http://robolectric.org/activity-lifecycle/

因此,对于您的情况,您可以这样做:

controller = Robolectric.buildActivity(MainActivity.class);
activity = controller.get();
assertThat(activity).isNotNull();
spy = spy(activity);
controller.create();

注意:在使用Robolectric进行测试时监视活动生命周期通常没有意义,因为您是驾驶它的人,因此您只测试自己的方法调用已执行。

答案 2 :(得分:0)

这意味着您必须先调用onCreate()方法。它必须是第一个被称为方法。

答案 3 :(得分:0)

如果有兴趣使用完全相同的控制器,并从事间谍活动,则可以通过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());

希望这会有所帮助。