1

在我的单元测试期间,我想基本上测试一个 Activity 是否是通过对按钮的简单压力启动的,即在HorizontalListView. 在之前的单元测试中,我已经成功地开始了新的活动,但是这个活动并没有如愿以偿。我有一个断言失败,告诉我我想开始的活动仍然是空的。

实际上,当我启动我的单元测试时,它似乎没有执行点击。我必须在测试期间自己使用我的小指来执行它才能通过测试。

为了查看我是否点击了正确的视图,我使用 Logs 来查看我的测试点击了哪个视图以及我真正想要点击的视图:它似乎是正确的视图(正确的 ID、正确的位置和正确的视图) . 所以我认为问题不在于我点击的地方。

我正在测试的 Activity 称为 StudioActivity,我要启动的 Activity 称为 AddBoasterActivity。

我的单元测试方法:

public void testSwitchToAddBoaster(){
    assertTrue(mBoasterPreviewFragment.getWithAddButton());
    ActivityMonitor activityMonitor = getInstrumentation().addMonitor(AddBoasterActivity.class.getName(), null, false);
    mStudioActivity.runOnUiThread(new Runnable() {
        @Override
        public void run(){
            int lPosition = mBoasterPreviewFragment.getAdapter().getCount()-1;
            View lView = mBoasterPreviewFragment.getBoaster().getChildAt(lPosition);

            //HERE ARE LOGS TO SEE IF MY TEST IS PERFORMING 
            //THE CLICK ON THE RIGHT VIEW AT THE GOOD POSITION
            Log.i("TEST POSITION:", ""+lPosition);
            Log.i("TEST ID: ",""+lView.getId());
            Log.i("TEST VIEW: ", ""+lView);
            //AND IT'S THE GOOD VIEW!

          mBoasterPreviewFragment.getBoaster().performItemClick(lView,lPosition,lView.getId());
        }
      });       
    AddBoasterActivity lAddBoasterActivity = (AddBoasterActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor,5000);        
    assertNotNull(lAddBoasterActivity); //HERE IS THE FAILURE, THE ACTIVITY HASN'T BEEN STARTED

    mWFBoasterPreviewFragment = new WeakReference<BoasterPreviewFragment>((BoasterPreviewFragment) lAddBoasterActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_preview));
    mBoasterPreviewFragment = mWFBoasterPreviewFragment.get();    
    assertNotNull(mBoasterPreviewFragment);

    lAddBoasterActivity.finish();
}    

OnItemClickListener:

mBoaster.setAdapter(mAdapter);
    if (withAddBoasterButton) {
        mBoaster.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (position == mAdapter.getCount() - 1) {
                    //HERE IS THE CURRENT VIEW
                    Log.i("POSITION:", ""+position);
                    Log.i("ID: ",""+id);
                    Log.i("VIEW: ", ""+view);
                    Intent intent = new Intent(getActivity().getApplicationContext(), AddBoasterActivity.class);
                    intent.putExtra(AddBoasterActivity.EXTRA_BOASTER_SELECTED, mSelectedUsers);
                    intent.putExtra(AddBoasterActivity.EXTRA_IS_STREAM, isStream);
                    startActivityForResult(intent, AddBoasterActivity.REQUEST_CODE_ACTIVITY);
            }
        }});
    }

对于必须自动化的测试来说,手动执行点击是相当尴尬的。因此,如果有人知道为什么会这样。

谢谢您的帮助!

4

1 回答 1

0

好吧,我终于找到了它……只是睡了一晚,没关系。我应该早点考虑一下,但Robotium已经帮助过我好几次了。

如果您还没有测试,请检查一下:https ://code.google.com/p/robotium/

下面是 Robotium 的样子:

public void testSwitchToAddBoaster(){
    Solo solo = new Solo(getInstrumentation(), getActivity());
    getInstrumentation().waitForIdleSync();
    ActivityMonitor activityMonitor = getInstrumentation().addMonitor(AddBoasterActivity.class.getName(), null, false);
    assertTrue(mBoasterPreviewFragment.getWithAddButton());

    int lPosition = mBoasterPreviewFragment.getAdapter().getCount()-1;
    View lView = mBoasterPreviewFragment.getBoaster().getChildAt(lPosition);

    solo.clickOnView(lView); //SIMPLE CLICK

    AddBoasterActivity lAddBoasterActivity = (AddBoasterActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor,5000);        
    assertNotNull(lAddBoasterActivity); //NOW THE ACTIVITY IS STARTED

    mWFBoasterPreviewFragment = new WeakReference<BoasterPreviewFragment>((BoasterPreviewFragment) lAddBoasterActivity.getSupportFragmentManager().findFragmentById(R.id.fragment_preview));
    mBoasterPreviewFragment = mWFBoasterPreviewFragment.get();    
    assertNotNull(mBoasterPreviewFragment);

    lAddBoasterActivity.finish();
}
于 2013-05-22T13:43:51.433 回答