gpt4 book ai didi

android - 如何让我的 ActivityUnitTestCases 与 MessageQueue 线程同步并调用我的处理程序?

转载 作者:太空狗 更新时间:2023-10-29 13:43:42 26 4
gpt4 key购买 nike

我正在为 Android 中的 ListActivity 编写单元测试,它使用处理程序来更新 ListAdapter。虽然我的 Activity 在 Android 模拟器中运行,但在单元测试中运行相同的代码不会更新我的适配器:对 sendEmptyMessage 的调用不会在我的 Activity 的处理程序中调用 handleMessage。

如何让我的 ActivityUnitTestCase 与 MessageQueue 线程同步并调用我的处理程序?

Activity 的代码有点像这样:

public class SampleActivity extends ListActivity implements SampleListener {
List samples = new ArrayList();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_list);
listView.setEmptyView(findViewById(R.id.empty));
}

private final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// unit test never reaches here
sharesAdapter = new SampleAdapter(SampleActivity.this, samples);
setListAdapter(sharesAdapter);
}
};

public void handleSampleUpdate(SampleEvent event) {
samples.add(event.getSample());
handler.sendEmptyMessage(0);
}
}

我的单元测试代码有点像这样:

public class SampleActivityTest extends ActivityUnitTestCase<SampleActivity> {

public SampleActivityTest() {
super(SampleActivity.class);
}

@MediumTest
public void test() throws Exception {
final SampleActivity activity = startActivity(new Intent(Intent.ACTION_MAIN), null, null);
final ListView listView = (ListView) activity.findViewById(android.R.id.list);
activity.handleSampleUpdate(new SampleEvent(this));
// unit test assert fails on this line:
assertTrue(listView.getCount() == 1);
}

}

最佳答案

我怀疑但我不确定这是因为使用检测线程和 UIThread 没有同步。所以你的处理程序绑定(bind)到创建它的线程。您的处理程序是在构造时创建的,因此它是调用构造函数的任何线程。我面前没有源代码,但我的猜测是,在大多数情况下,当应用程序正在运行时,我敢打赌它是 UIHead(主要)在您的 Activity 中构造和调用 onCreate()。但是当单元测试运行时,它被绑定(bind)到可能构造您的 Activity 的 Instrumentation Thread,然后在 UIThread 上调用 onCreate。现在你在检测线程中说,发送一条消息,你的线程没有与之关联的循环程序来对它做任何事情。所以它只是坐在队列中。尝试将您的处理程序创建移动到 onCreate()。这应该将您的处理程序绑定(bind)到主循环器,然后您的异步事件将从另一个线程(检测线程)触发,并且 UIThread 将很乐意从队列中获取它们。

虽然我还没有测试过,但乍一看似乎是问题所在。

关于android - 如何让我的 ActivityUnitTestCases 与 MessageQueue 线程同步并调用我的处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2540967/

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