我想测试包含ListFragment的活动的功能,但我不知道如何解决这个问题.我已经尝试了很多,但似乎没有任何效果.
因此,我要测试的活动包含一个ListFragment,并使用LoaderManager.LoaderCallbacks和CursorLoader填充此ListFragment.此CursorLoader查询ContentProvider,onLoadFinished()方法将Cursor交换到ListView的ListAdapter.
我想通过测试实现的是启动活动,然后测试ListView是否填充了正确的数据.因为我的ContentProvider的内容基于从具有服务的Web服务检索的内容,我认为我应该模拟ContentProvider以确保测试数据是测试期望的内容.但这说起来容易做起来难.我遇到了各种各样的问题.
我相信大多数问题都来自于我的数据是通过CursorLoader通过AsyncTask加载的.我在ListFragment的onCreate()方法中启动我的加载器,但是在onCreate()完成后我的测试执行,因为它不等待AsyncTask加载完成.并且因为在测试执行之前加载没有完成,我的测试失败了.
这是我的测试类:
public class TopscorersActivityTest extends ActivityUnitTestCase {
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,testing
来源: https://codeday.me/bug/20190530/1184716.html