gpt4 book ai didi

android - 在 Android View 中使用 UI 元素进行测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:59 26 4
gpt4 key购买 nike

我正在尝试使用以下测试用例测试简单的 UI,主要思想是在测试中设置一些 UI 文本(模拟用户输入),然后主动点击一个事件。

public class StackTestCase 
extends ActivityInstrumentationTestCase2<Stack>
{
private StackDemo mActivity;

private EditText eaten;
public StuckTestCase() {
super("com.crocodil.software.stack", Stack.class);


}
public StuckTestCase(Class<Stack> activityClass) {
super("com.crocodil.software.stack", activityClass);

}
protected void setUp() throws Exception {
super.setUp();
mActivity = this.getActivity();
mCount = (Button) mActivity.findViewById(com.crocodil.software.stack.R.id.action);
eaten = (EditText) mActivity.findViewById(com.crocodil.software.stack.R.id.eaten);

}

public void testPreconditions() {
assertNotNull(mStatus);
}

public void testSimpleDefaults(){
double status = Double.valueOf(mStatus.getText().toString());
eaten.setText(2);
mCount.performClick();
assertEquals((status-2),Double.valueOf(mStatus.getText().toString()));
}

}

运行结果异常-

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
at android.view.ViewRoot.playSoundEffect(ViewRoot.java:2581)
at android.view.View.playSoundEffect(View.java:8516)
at android.view.View.performClick(View.java:2407)
at com.crocodil.software.stack.test.StackTestCase.testSimpleDefaults(StackTestCase.java:46)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)
at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:520)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1447)

每次访问 UI 元素时都会发生这种情况,我无法通过使用句柄或异步任务来避免它?有什么建议吗?

最佳答案

这是一个老问题,但无论如何我都会给你一个答案,以防有人偶然发现它。

除了主线程(UI 线程)之外,您不能从任何地方更改 UI 小部件的状态。您的 performClick 必须像这样完成:

mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
mCount.performClick();
}
});

但这还不是全部,您还需要通过添加以下行将您的仪器测试与 ui 同步:

getInstrumentation().waitForIdleSync();

同步行通常紧跟在 runOnUiThread() 代码之后。

关于android - 在 Android View 中使用 UI 元素进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3596397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com