package android.database.cts;
import dalvik.annotation.TestLevel;
import dalvik.annotation.TestTargetClass;
import dalvik.annotation.TestTargetNew;
import dalvik.annotation.TestTargets;
import android.content.ContentResolver;
import android.content.Context;
import android.content.IContentProvider;
import android.database.CharArrayBuffer;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.database.DataSetObserver;
import android.database.StaleDataException;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.test.AndroidTestCase;
import java.io.File;
import java.util.Arrays;
@TestTargetClass(android.database.CursorWrapper.class)
public class CursorWrapperTest extends AndroidTestCase {
private static final String FIRST_NUMBER = "123";
private static final String SECOND_NUMBER = "5555";
private static final int TESTVALUE1 = 199;
private static final int TESTVALUE2 = 200;
private static final String[] NUMBER_PROJECTION = new String[] {
"_id", // 0
"number" // 1
};
private static final int DEFAULT_RECORD_COUNT = 2;
private static final int DEFAULT_COLUMN_COUNT = 2;
private SQLiteDatabase mDatabase;
private File mDatabaseFile;
private Cursor mCursor;
private static final int CURRENT_DATABASE_VERSION = 42;
@Override
protected void setUp() throws Exception {
super.setUp();
setupDatabase();
}
@Override
protected void tearDown() throws Exception {
closeDatabase();
super.tearDown();
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test close() and isClosed() and the constructor method.",
method = "close",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test close() and isClosed() and the constructor method.",
method = "isClosed",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test close() and isClosed() and the constructor method.",
method = "requery",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test close() and isClosed() and the constructor method.",
method = "CursorWrapper",
args = {android.database.Cursor.class}
)
})
public void testConstrucotorAndClose() {
CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
assertTrue(cursorWrapper.requery());
cursorWrapper.deactivate();
cursorWrapper.move(1);
assertEquals(DEFAULT_RECORD_COUNT, cursorWrapper.getCount());
assertFalse(cursorWrapper.isClosed());
assertTrue(cursorWrapper.requery());
cursorWrapper.close();
assertTrue(cursorWrapper.isClosed());
assertFalse(cursorWrapper.requery());
}
private Cursor getCursor() {
Cursor cursor = mDatabase.query("test1", NUMBER_PROJECTION, null, null, null, null, null);
return cursor;
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "getCount",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "requery",
args = {}
)
})
public void testGetCount() {
CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
int defaultCount = cursorWrapper.getCount();
// Add two records into the table.
addWithValue(mDatabase, TESTVALUE1);
int expected = defaultCount + 1;
assertTrue(cursorWrapper.requery());
assertEquals(expected, cursorWrapper.getCount());
addWithValue(mDatabase, TESTVALUE2);
expected += 1;
assertTrue(cursorWrapper.requery());
assertEquals(expected, cursorWrapper.getCount());
// Delete previous two records which have been added just now.
deleteWithValue(mDatabase, TESTVALUE1);
assertTrue(cursorWrapper.requery());
assertEquals(defaultCount + 1, cursorWrapper.getCount());
deleteWithValue(mDatabase, TESTVALUE2);
assertTrue(cursorWrapper.requery());
assertEquals(defaultCount, cursorWrapper.getCount());
// Continue to delete all the records
deleteAllRecords(mDatabase);
assertTrue(cursorWrapper.requery());
assertEquals(0, cursorWrapper.getCount());
cursorWrapper.close();
assertFalse(cursorWrapper.requery());
// Restore original database status
rebuildDatabase();
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "deactivate",
args = {}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "registerDataSetObserver",
args = {android.database.DataSetObserver.class}
),
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "",
method = "unregisterDataSetObserver",
args = {android.database.DataSetObserver.class}
)
})
public void testDeactivate() throws IllegalStateException {
CursorWrapper cursorWrapper = new CursorWrapper(getCursor());
MockObserver observer = new MockObserver();
// one DataSetObserver can't unregistered before it had been registered.
try{
cursorWrapper.unregisterDataSetObserver(observer);
fail("testUnregisterDataSetObserver failed");
}catch(IllegalStateException e){
}
// Before registering, observer can't be notified.
assertFalse(observer.hasInvalidated());
cursorWrapper.moveToLast();
cursorWrapper.deactivate();
assertFalse(observer.hasInvalidated());
// Test with registering DataSetObserver
assertTrue(cursorWrapper.requery());
cursorWrapper.registerDataSetObserver(observer);
assertFalse(observer.hasInvalidated());
cursorWrapper.moveToLast();
assertEquals(Integer.parseInt(SECOND_NUMBER), cursorWrapper.getInt(1));
cursorWrapper.deactivate();
// deactivate method can invoke invalidate() method, can be observed by DataSetObserver.
assertTrue(observer.hasInvalidated());
// After deactivating, the cursor can not provide values from database record.
try {
cursorWrapper.getInt(1);
fail("After deactivating, cursor cannot execute getting value operations.");
} catch (StaleDataException e) {
}
// Can't register a same observer twice before unregister it.
try{
cursorWrapper.registerDataSetObserver(observer);
fail("testRegisterDataSetObserver failed");
}catch(IllegalStateException e){
}
// After runegistering, observer can't be notified.
cursorWrapper.unregisterDataSetObserver(observer);
observer.resetStatus();
assertFalse(observer.hasInvalidated());
cursorWrapper.moveToLast();
cursorWrapper.deactivate();
assertFalse(observer.hasInvalidated());
// one DataSetObserver can't be unregistered twice continuously.
try{
cursorWrapper.unregisterDataSetObserver(observer);
fail("testUnregisterDataSetObserver failed");
}catch(IllegalStateException e){
}
}
@TestTargets({
@TestTargetNew(
level = TestLevel.COMPLETE,
notes = "Test getColumnCount()",
method = "getColumnCount",
args = {}
),
Test_dup2_x2.rar_android


2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
在Android开发中,测试是确保应用稳定性和质量的关键环节。`Test_dup2_x2.rar_android`这个压缩包可能包含了一组用于测试特定功能的代码,尤其是与数据库操作相关的部分,因为"Cursor Wrapper Test"通常涉及到对SQLite数据库查询结果的封装和测试。下面我们将深入探讨这些知识点。 我们看到一个名为`Test_dup2_x2.java`的文件。在Android测试框架中,文件名中的`Test`通常表示这是一个测试类。`dup2_x2`可能指的是某种重复或倍增的操作,这可能是在测试某个功能的多线程处理或者复制行为。在Android测试中,我们经常使用JUnit和 Espresso等工具来编写单元测试和UI测试。这个类可能包含了针对特定业务逻辑或组件的测试用例,通过断言(assertions)来验证预期结果。 接下来,`CursorWrapperTest.java`这个文件名暗示了它是一个专门针对`Cursor`对象的包装器类的测试。在Android中,`Cursor`是用于遍历SQLite数据库查询结果的数据结构。开发者通常会创建`CursorWrapper`类来扩展或增强原生`Cursor`的功能,例如添加日志记录、错误处理或者性能优化。测试此类的主要目的是确保包装器正确地转发了`Cursor`的所有基本操作,如`moveToFirst()`, `moveToNext()`, `getColumnIndex()`, `getString()`等,并且在必要时进行自定义处理。 在`CursorWrapperTest`中,测试方法可能会模拟不同的数据库状态,调用包装器的方法并验证其返回值、抛出的异常以及对原始`Cursor`的影响。测试可能包括边界条件测试(如空cursor、超出范围的索引访问)、异常处理测试(如当数据库关闭时尝试访问cursor)以及性能测试(检查包装器是否影响了cursor的遍历速度)。 为了有效地进行测试,开发者通常会遵循TDD(Test-Driven Development,测试驱动开发)原则,先编写测试用例,然后实现功能代码,确保所有测试都能通过。在这个场景下,`CursorWrapperTest`的用例可能在`Test_dup2_x2.java`之前编写,确保`CursorWrapper`类的实现满足预期。 在Android Studio中,测试类通常位于`app/src/test/java`目录下,而源代码则位于`app/src/main/java`。测试类可以通过`@RunWith(AndroidJUnit4.class)`注解来指定使用Android测试运行器,并且可以使用`@SmallTest`, `@MediumTest`, `@LargeTest`注解来标记测试的规模。 `Test_dup2_x2.rar_android`这个压缩包中包含的代码可能是为了测试一个具有特定行为(可能涉及数据复制或加倍)的组件,并且特别关注与数据库交互的部分,通过`CursorWrapper`提供定制化的操作。这样的测试有助于确保数据库操作的正确性和效率,为Android应用的稳定运行提供了坚实的基础。































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 87
- 资源: 1万+





我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- VTJ-Typescript资源
- go验证码合集包-Go资源
- 跨境电子商务基础-电子教案-教学指南
- 5MW风电永磁直驱-1200V直流并网仿真的混合储能系统及滑动平均滤波算法应用
- 模拟电子技术(第4版)-电子教案-教学指南
- 人工智能技术应用导论(第2版)-电子教案-教学指南
- 人工智能应用基础(第2版)-电子教案-教学指南
- ThingsGateway-C#资源
- 三菱FX3u PLC应用实例教程(第2版)-电子教案-教学指南
- QT与C#在工业上位机MES系统的九套开发成果及实战经验分享
- 网络存储技术及应用(第2版)-电子教案-教学指南
- 网络设备配置与调试项目实训(第4版)-电子教案-教学指南
- MATLAB实现基于小波精英解学习与多角度搜索的阴阳平衡优化算法及其应用
- AJ-Captcha-PHP资源
- AirPower-JavaScript资源
- 网络推广实务PPT课件


