测试是否在检测测试中调用finish()

时间:2015-11-14 20:59:26

标签: android android-testing

正在测试的活动是一个简单的棋盘游戏。当满足游戏结束所需的条件时,在做了几件事以显示谁赢了之后,运行以下代码:

// Return to main menu after 5 seconds
Handler h = new Handler();
h.postDelayed(new Runnable() {
    @Override
    public void run() {
        finish();
    }
}, 5000);

我有一个使用ActivityInstrumentationTestCase2的仪器测试。我可以制造它,以便测试从电路板开始,远离上面的代码被调用。但是在做完这个动作之后我怎么能断言finish()被调用了?

我尝试使用ActivityUnitTestCase isFinishCalled()方法重复此测试,但我还没有能够使其正常工作。

1 个答案:

答案 0 :(得分:2)

我有2个可能解决此问题的方法:

  1. 使用Robolectric框架将测试重写为单元测试:

    setTimeout

    然后测试看起来像:

    public class MainActivity extends AppCompatActivity {
        ........
    
        public void finishGame() {
            Handler h = new Handler();
            h.postDelayed(new Runnable() {
                @Override
                public void run() {
                    finish();
                }
            }, 5000);
        }
    }
    
  2. 仅在单元测试中避免使用@RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk=21) public class MainActivityTest { @Test public void testFinishing() throws InterruptedException { MainActivity mainActivity = new MainActivity(); assertFalse(mainActivity.isFinishing()); mainActivity.finishGame(); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); assertTrue(mainActivity.isFinishing()); } }

    Handler

    然后测试看起来像:

    public class MainActivity extends AppCompatActivity {
        ........
    
        public void finishGame(boolean postDelayed) {
            if (postDelayed) {
                Handler h = new Handler();
                h.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        finish();
                    }
                }, 5000);
    
                return;
            }
    
            finish();
        }
    }
    

    在生产代码中,您将此方法称为public class MainActivityTest extends ActivityTestCase { public MainActivityTest() { super(); setActivity(new MainActivity()); } public void testFinishing() { assertFalse(getActivity().isFinishing()); ((MainActivity)getActivity()).finishGame(false); assertTrue(getActivity().isFinishing()); } }

  3. 在我的项目中,我坚持使用第二个选项(在我的情况下,我正在测试finishGame(true)的行为,同时还需要延迟以确保正确构建视图)

    我希望,这有帮助