代码之家  ›  专栏  ›  技术社区  ›  RickNotFred

称为“错误线程例外”在Android上执行JUnit测试

  •  3
  • RickNotFred  · 技术社区  · 16 年前

    我刚接触到JUnit和Android,很难找到与Android合作的良好测试文档。

    我有一个带有扩展ActivityInstrumentationTestCase2类的测试项目。检查GUI状态(启用内容、相对位置等)的简单测试按预期工作。但是,当我尝试执行按钮单击操作时,会引发错误的线程异常。有人知道如何解决这个问题吗?

    接下来,有人对免费测试资源或Android的TDD有什么好的建议吗?我正在使用Eclipse/Motodev。

    谢谢

    我可以根据调用每个按钮的方式获得不同的故障跟踪,但这里包括一个用于参考:

    android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
    at android.view.ViewRoot.playSoundEffect(ViewRoot.java:2472)
    at android.view.View.playSoundEffect(View.java:8307)
    at android.view.View.performClick(View.java:2363)
    at com.android.tigerslair.demo1.test.GoTest.setUp(GoTest.java:49)
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
    at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
    at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:430)
    at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)
    

    下面是简单的setup()例程:

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        TigersLair activity=getActivity();
    
        mGoBtn = (Button) activity.findViewById(R.id.go);
        mGoBtn.performClick();        
    }
    

    不管是执行click-in-setup()还是实际测试。

    1 回复  |  直到 14 年前
        1
  •  7
  •   lars    16 年前

    您需要执行uithread中的所有单击。

    这可以通过以下两个例子来实现。

    @UiThreadTest
    public void testApp() {
      TestApp activity = getActivity();
    
      Button mGoBtn = (Button) activity.findViewById(R.id.testbutton);
      mGoBtn.performClick();
    }
    

    public void testApp2() throws Throwable {
      TestApp activity = getActivity();
    
      final Button mGoBtn = (Button) activity.findViewById(R.id.testbutton);
      runTestOnUiThread(new Runnable() {
    
        @Override
        public void run() {
          mGoBtn.performClick();
        }
      });
    }