Android 机器人分子:使用ormlite进行测试

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

我试图用robolectric测试ORMLite DAOs,但数据库行为与从我的android应用程序中使用时不同。我的DAO在android应用程序上运行得非常好

在阅读有关机器人阴影和调试代码时,我遇到了(代码)

有人知道这个阴影是否足以测试ormlite DAO吗?或者我必须创造我自己的影子来实现这一点?这里有什么线索/提示/建议/例子吗

提前谢谢


额外信息:

试验方法:

@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
    更改为
    enabled
    )以避免camelCase问题时,以前的错误仍然存在。。。似乎内存数据库没有应用我对实体所做的更改
使用的版本:

  • 机器人分子1.1
  • 奥姆利特4.41

很抱歉,我再次提起你的话题,但我遇到了同样的问题

我使用的是OrmLite 4.45和Robolectric 2.1

在中,
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);
    }
}
}