Android 机器人分子:使用ormlite进行测试
我试图用robolectric测试ORMLite DAOs,但数据库行为与从我的android应用程序中使用时不同。我的DAO在android应用程序上运行得非常好 在阅读有关机器人阴影和调试代码时,我遇到了(代码) 有人知道这个阴影是否足以测试ormlite DAO吗?或者我必须创造我自己的影子来实现这一点?这里有什么线索/提示/建议/例子吗 提前谢谢Android 机器人分子:使用ormlite进行测试,android,testing,dao,ormlite,robolectric,Android,Testing,Dao,Ormlite,Robolectric,我试图用robolectric测试ORMLite DAOs,但数据库行为与从我的android应用程序中使用时不同。我的DAO在android应用程序上运行得非常好 在阅读有关机器人阴影和调试代码时,我遇到了(代码) 有人知道这个阴影是否足以测试ormlite DAO吗?或者我必须创造我自己的影子来实现这一点?这里有什么线索/提示/建议/例子吗 提前谢谢 额外信息: 试验方法: @Test public void basicTest() throws SQLException { as
额外信息: 试验方法:
@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
}
运行此测试时遇到的一些问题:
- 查询具有“camelCased”属性名称的实体时出错:在测试()的最后一行抛出错误。在运行android应用程序时从未遇到过这样的问题
- 当我将其中一个属性名称(例如,
更改为isEnabled
)以避免camelCase问题时,以前的错误仍然存在。。。似乎内存数据库没有应用我对实体所做的更改enabled
- 机器人分子1.1
- 奥姆利特4.41
cacheColumnNames
方法对每个列名调用toLowerCase
。所以我决定用我自己的扩展ShadowSQLiteCursor
(它不调用toLowerCase
):
/**
*通过包装JDBC结果集来模拟Android光标对象。
*/
@实现(value=SQLiteCursor.class,inheritImplementationMethods=true)
公共类ShadowCaseSensitiveSQLiteCursor扩展了ShadowSQLiteCursor{
私有结果集结果集;
public void _构造函数_(SQLiteCursorDriver,String editTable,SQLiteQuery查询){}
/**
*存储列名,以便在结果集关闭后可以检索列名
*/
专用void缓存列名称(结果集rs){
试一试{
ResultSetMetaData元数据=rs.getMetaData();
int columnCount=metaData.getColumnCount();
columnNameArray=新字符串[columnCount];
对于(int columnIndex=1;columnIndex),如果不是“e1”,那么事件的名称是什么
?我假设您正在使用Sqlite进行测试。除非您生成自己的架构,并且db字段名与Java不匹配(区分大小写),否则我不会认为camelcase是个问题。@Gray此时,当查询要检索保存的事件时,测试崩溃,出现异常。QueryForId无法工作,因为抛出“camelCase error”。@Gray您是对的,我使用的是SQLite,架构是从MyDatabaseHelper.onCreate(..)
(它扩展了OrmLiteSqliteOpenHelper
)和TableUtils.createTable(connectionSource,Event.class)自动生成的Jelies,你能接受flav给出的答案吗?它对我很有效。它确实帮助了我。我在测试类中添加了@Config(shadows={ShadowCaseSensitiveSQLiteCursor.class})
/**
* 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);
}
}
}