我正在尝试使用robolectric测试ORMLite DAO,但数据库行为与从我的Android应用程序中使用它时不同。我的 DAO 在安卓应用程序上运行良好。
在阅读有关机器人阴影和调试代码的信息时,我遇到了ShadowSQLiteOpenHelper(代码在这里)。
有谁知道这个影子是否足以测试奥姆利特道?还是我必须创造自己的影子才能实现这一目标?这里有任何线索/提示/建议/示例吗?
提前谢谢。
额外信息:
测试方法:
@Test
public void basicTest() throws SQLException {
assertNotNull(randomStringResource); // Injection of an android resource: OK
assertThat(randomStringResource, equalTo("Event")); // With correct value: OK
assertNotNull(eventDao); // Dao injection: OK
assertThat(eventDao.countOf(), equalTo(0L)); // Table empty: OK
Event e1 = new Event("e1", new Date());
eventDao.create(e1);
assertNotNull(e1.getId()); // ID generated by OrmLite: OK
assertThat(eventDao.countOf(), equalTo(1L)); // Table not empty: OK
assertThat("e1", equalTo(eventDao.queryForId(e1.getId()).getName())); // Query for inserted event: Throws exception
}
运行此测试时遇到的一些问题:
- 查询具有"驼峰"属性名称的实体时出错:在测试的最后一行引发错误(相关问题)。运行安卓应用程序从未遇到过这样的问题。
- 当我更改这些属性名称之一(例如,
isEnabled
到enabled
)以避免驼峰问题时,以前的错误仍然存在......似乎内存数据库没有应用我对实体所做的更改。
使用的版本:
- 机器人 1.1
- 奥姆利特 4.41
很抱歉复活您的主题,但我遇到了同样的问题。
我正在使用OrmLite 4.45和Robolectric 2.1。
在 ShadowSQLiteCursor.java 中,cacheColumnNames
方法调用toLowerCase
每个列名。所以我决定用我自己的(不叫toLowerCase
)扩展ShadowSQLiteCursor
:
/**
* Simulates an Android Cursor object, by wrapping a JDBC ResultSet.
*/
@Implements(value = SQLiteCursor.class, inheritImplementationMethods = true)
public class ShadowCaseSensitiveSQLiteCursor extends ShadowSQLiteCursor {
private ResultSet resultSet;
public void __constructor__(SQLiteCursorDriver driver, String editTable, SQLiteQuery query) {}
/**
* Stores the column names so they are retrievable after the resultSet has closed
*/
private void cacheColumnNames(ResultSet rs) {
try {
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
columnNameArray = new String[columnCount];
for(int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
String cName = metaData.getColumnName(columnIndex);
this.columnNames.put(cName, columnIndex - 1);
this.columnNameArray[columnIndex - 1] = cName;
}
} catch(SQLException e) {
throw new RuntimeException("SQL exception in cacheColumnNames", e);
}
}
}
我的回答显然来得太晚了,但可能会帮助其他人!