java - 如何在使用 Robolectric 时监视 Activity

标签 java android unit-testing android-testing robolectric

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

我有一项 Activity 要测试。

主 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:在行 spy.onCreate(null) 处的 onCreate() 之前,系统服务对 Activity 不可用

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

最佳答案

这就是我的诀窍。我在获取要监视的 Activity 之前使用 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);

}

关于java - 如何在使用 Robolectric 时监视 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444476/

相关文章:

android - 如何从 android 应用程序管理多语言?

android - 为什么缩小会导致错误 "JSONObject["奖励“] 不是字符串”?

ruby-on-rails - 如何对命名空间模型进行单元测试

java - A* (A Star) 算法输出所有可能的解决方案

java - 我应该如何将键值传递给 PL/SQL 过程?

java - 按钮逻辑被忽略 - 为什么?

android - 在我的 Android 应用程序中禁用屏幕截图

c# - 为了可测试性,向 ComboBox 添加功能的正确方法是什么?

php - 使用链式方法和参数模拟调用

java - JVM 与 Dalvik 和/或 ART 究竟有何不同?