gpt4 book ai didi

android - 我应该如何测试包含 ListFragment 的 Android Activity 的功能?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:26 28 4
gpt4 key购买 nike

我想测试包含 ListFragment 的 Activity 的功能,但我不确定如何去做。我已经尝试了很多,但似乎没有任何效果。

所以我要测试的 Activity 包含一个 ListFragment,这个 ListFragment 是通过使用 LoaderManager.LoaderCallbacks 和一个 填充的光标加载器。此 CursorLoader 查询 ContentProvideronLoadFinished() 方法将 Cursor 交换到 ListAdapterListView

我想通过我的测试实现的是启动 Activity ,然后测试 ListView 是否填充了正确的数据。因为我的 ContentProvider 的内容基于从带有 Service 的网络服务检索的内容,所以我认为我应该模拟 ContentProvider 以确保测试数据是测试所期望的。但这说起来容易做起来难。我遇到了各种各样的问题。

我相信大多数问题都是因为我的数据是由 CursorLoader 通过 AsyncTask 加载的。我在 ListFragmentonCreate() 方法中启动我的加载程序,但在 onCreate() 完成我的测试后执行,因为它不等待AsyncTask 加载完成。并且因为在测试执行之前加载没有完成,所以我的测试失败了。

这是我的测试类:

public class TopscorersActivityTest extends ActivityUnitTestCase<TopscorersActivity> {

public static final int TEST_POSITION = 1;
public static final String TEST_NAME = "name";
public static final String TEST_CLUB = "club";
public static final int TEST_GOALS = 2;

private Intent mStartIntent;
private ListView mListView;
private Context mContext;
private ContentResolver mContentResolver;

public TopscorersActivityTest() {
super(TopscorersActivity.class);
}

@Override
protected void setUp() throws Exception {
super.setUp();
mStartIntent = new Intent();

mContext = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), "test");
mContentResolver = mContext.getContentResolver();
setActivityContext(mContext);

// Setup database fixture
ContentValues values = new ContentValues();
values.put(Topscorers.TOPSCORER_POSITION, TEST_POSITION);
values.put(Topscorers.TOPSCORER_NAME, TEST_NAME);
values.put(Topscorers.TOPSCORER_CLUB, TEST_CLUB);
values.put(Topscorers.TOPSCORER_GOALS, TEST_GOALS);

mContentResolver.delete(Topscorers.CONTENT_URI, null, null);
mContentResolver.insert(Topscorers.CONTENT_URI, values);
}

public void testPreConditions() {
startActivity(mStartIntent, null, null);
assertNotNull(getActivity());

mListView = (ListView) getActivity().findViewById(android.R.id.list);
assertNotNull(mListView);

Cursor cursor = mContentResolver.query(Topscorers.CONTENT_URI, null, null, null, null);
assertEquals(1, cursor.getCount());
}

public void testListPopulatedCorrectly() {
startActivity(mStartIntent, null, null);
getInstrumentation().waitForIdleSync();

ListView listView = (ListView) getActivity().findViewById(android.R.id.list);
assertEquals(1, listView.getCount());
}
}

testPreConditions() 测试成功,但 testListPopulatedCorrectly() 失败,因为 listView.getCount() 返回 0。

我怎样才能达到我想要的?我的测试代码是否朝着正确的方向前进?还是我应该采取另一种方法?如果是,是什么?

最佳答案

在单元测试中,我没有使用@Jan-Henk 提到的Thread.wait(500) 调用,而是使用了DataSetObserver。通过做:

mListView.getAdapter().registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
assertTrue(mListView.getCount() > 0);
}
});

这样做可以让您准确地在更改发生时获得更改。

关于android - 我应该如何测试包含 ListFragment 的 Android Activity 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9002140/

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