Android:如何使单元测试失败

时间:2011-05-05 21:47:01

标签: android unit-testing lifecycle

我正在测试一个销毁/重启序列,以确保计数器保留其原始值(在重启之前错误地递增)。当我手动测试时,我修复了它并且它工作正常。但单元测试总是通过,无论我是否包含修复程序。正如您在下面的代码中看到的,我得到计数​​器值,然后重新启动,再次获取计数器值并进行比较。可能是什么问题呢?

public void testNumCorrectEqualAfterDestroy() {

mCorrect = (TextView) mActivity.findViewById(R.id.correct);

    int before = Integer.parseInt(mCorrect.getText().toString());
    mActivity.finish();
    mActivity = this.getActivity();

mCorrect = (TextView) mActivity.findViewById(R.id.correct);

    int after = Integer.parseInt(mCorrect.getText().toString());

    Assert.assertEquals(before, after);

  } 

2 个答案:

答案 0 :(得分:1)

我认为finish()不会通过“适当”状态循环你的活动。我之前测试过这个生命周期案例的方式是这样的:

...
//TODO: do not use getActivity, instead use the startActivity() method 
//and pass a value in the Bundle parameter 
...
getInstrumentation().callActivityOnStart(mActivity);
getInstrumentation().callActivityOnResume(mActivity);
//TODO: asssert that the value is the expected one (based on what you fed in the bundle)
Bundle newBundle = new Bundle();
getInstrumentation().callActivityOnSaveInstanceState(mActivity, newBundle);
getInstrumentation().callActivityOnPause(mActivity);
getInstrumentation().callActivityOnStop(mActivity);
getInstrumentation().callActivityOnDestroy(mActivity);

//initialize activity with the saved bundle
getInstrumentation().callActivityOnCreate(mActivity, newBundle); 
getInstrumentation().callActivityOnResume(mActivity);

//TODO: assert that the value is the expected one

答案 1 :(得分:0)

ActivityInstrumentationTestCase2.getActivity()在您第一次调用它时启动Activity,然后它只会在测试用例的每个后续调用中返回该Activity 。因此,您仍在查看已完成的活动。

完成第一个活动后,您需要从测试中开始一个新活动。例如,您可以使用InstrumentationTestCase.launchActivity()

作为另一个例子,我编写了一个测试,在ActivityA中按下一个按钮,启动ActivityB for-result;测试然后立即杀死ActivityA(通过方向更改,但finish()也可以工作),然后测试获取系统在ActivityB完成时创建并发送其结果的新ActivityA的句柄。有一个技巧是让测试添加一个Instrumentation.ActivityMonitor,然后让该监视器等待系统启动新的ActivityA并为测试提供一个句柄。