Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用Robolectric时监视活动_Java_Android_Unit Testing_Android Testing_Robolectric - Fatal编程技术网

Java 如何在使用Robolectric时监视活动

Java 如何在使用Robolectric时监视活动,java,android,unit-testing,android-testing,robolectric,Java,Android,Unit Testing,Android Testing,Robolectric,我是Android新手,我正在玩Robolectric进行单元测试。 我面临以下问题 我有一项活动要测试 MainActivity.java public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks { private NavigationDrawerFragment mNavigationDrawer

我是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);
    }
}
@RunWith(RobolectricGradleTestRunner.class)
@配置(常量=BuildConfig.class)
公共类维护活动测试{
专用活动控制器;
私人活动;
私人间谍活动;
@试验
创建时的公共无效\u应启动AvigationDrawerFragment(){
控制器=Robolectric.buildActivity(MainActivity.class);
activity=controller.get();
assertThat(activity.isNotNull();
间谍=间谍(活动);
spy.onCreate(null);
验证(spy).onCreate(null);
}
}
但我得到了以下例外:

java.lang.IllegalStateException:onCreate()之前的活动无法使用系统服务
spy.onCreate(null)


我已经在谷歌上搜索了几个小时,我(盲目地)尝试了几个变通方法,但都没有成功。有谁能给我指点迷津吗?

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

您应该通过Robolectric驱动活动生命周期。 见:

因此,对于您的案例,您可以:

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

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

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

}

如果对使用完全相同的控制器感兴趣,并使用活动的间谍,则可以通过反射修改控制器的内部类,请选中此方法:

public static <T extends Activity> T getSpy(ActivityController<T> activityController) {
    T spy = spy(activityController.get());
    ReflectionHelpers.setField(activityController, "component", spy);
    return spy;
}

希望这有帮助

这是第一种叫做。。。事实上,这是唯一的方法。今晚我将尝试这种方法。我测试
onCreate
方法只是为了确保
NavigationDrawerFragment
被创建,而不是活动的生命周期。我还认为
Mockito
spy
PowerMock
应该只在例外情况下使用。在过去的两年中,我没有使用任何
spy
PowerMockito
robololectric
一起使用,因为被监视的活动不是由控制器处理的,所以你的自旋网不起作用。无论如何,谢谢你的帮助。我想我会放弃检查片段是否被设置。我真的不明白为什么有人说我们不应该对我们正在测试的活动进行“模拟/监视”。有时,这些活动调用导致错误的函数(如getApplication())。我只想让我的活动返回一个模拟的应用程序对象,但如果不模拟测试中的活动,我就无法返回。@Davis,这可能属于另一个问题,可以在这里进行更详细的探讨。可能还有其他更好的方法来实现您想要实现的目标。您找到解决方案了吗?您是否尝试调用
controller.create()
而不是
spy.onCreate(null)
?请参阅我的答案,在这里用
robololectric
监视活动,因为
onCreate()
方法在活动中受保护。
controller = Robolectric.buildActivity(MainActivity.class);
activity = getSpy(controller.get());