Testcase看到陈旧的TextView值:在Android中测试方向更改

时间:2014-04-09 21:07:05

标签: android unit-testing junit robotium android-testing

我写了一个包含ActivityListView的简单TextView。选择ListView项后,TextView会反映项目文字。我没有特别添加处理旋转变化的代码。当我运行应用程序时,我得到了预期的结果:

  • 点击的项目显示在TextView
  • 旋转后,显示TextView的默认值

然而,在运行我的测试(扩展ActivityInstrumentationTestCase2)后,会发生这种情况:

  • 点击项目的值已正确记录在我的测试
  • 旋转后,测试获得TextView的旧值(尽管我可以看到我的设备上的文字发生了变化!)

这是我的测试:

@Override
protected void setUp() throws Exception {
    super.setUp();
    mActivity=(MainActivity) getActivity();
    lv=(ListView) mActivity.findViewById(com.example.samplee.R.id.lv1);
    }

public void testDestroy() {
    mActivity.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            lv.requestFocus();
            lv.setSelection(0);
        }
    });
    this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
    //select 2nd item in ListView
    this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
    TextView tv=(TextView)mActivity.findViewById(com.example.samplee.R.id.textView1);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    String origValue=(String) tv.getText();
    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    tv=(TextView)mActivity.findViewById(com.example.samplee.R.id.textView1);
    String newValue=(String) tv.getText();  //gets same value as origValue!
    assertEquals(origValue,newValue);  //always succeds;
}

在某些SO帖子中,我读到了使用getInstrumentation().waitForIdleSync()代替我的Thread.sleep()代码。那也没有用。

我也尝试过Robotium。没变!关于如何解决这个问题的任何指示?

1 个答案:

答案 0 :(得分:1)

轮换后,您将获得一个新活动。尝试用solo.getCurrentActivity()替换mActivity.findViewById(...)。findViewById(...)。