3

ロボレクトリックを使用してORMLiteDAOをテストしようとしていますが、データベースの動作は、Androidアプリから使用した場合と同じではありません。私のDAOはAndroidアプリケーションで完全に機能しています。

ロボレクトリックシャドウとデバッグコードについて読んで、ShadowSQLiteOpenHelperここにコード)に遭遇しました。

このシャドウがormlitedaosをテストするのに十分かどうか誰かが知っていますか?または、それを実現するために独自のシャドウを作成する必要がありますか?ここに手がかり/ヒント/提案/例はありますか?

前もって感謝します。


追加情報:

試験方法:

@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アプリの実行で問題が発生したことはありません。
  • キャメルケースの問題を回避するためにこれらのプロパティ名の1つを変更したとき(たとえば、isEnabledenabled)、以前のエラーが持続しました...メモリデータベースがエンティティに加えた変更を適用しなかったようです。

使用したバージョン:

  • Robolectric 1.1
  • OrmLite 4.41
4

1 に答える 1

6

あなたのトピックを復活させて申し訳ありませんが、私は同じ問題に遭遇しました。

OrmLite4.45とRobolectric2.1を使用しています。

ShadowSQLiteCursor.javaでは、cacheColumnNamesメソッドはtoLowerCase各列名を呼び出します。だから私は自分自身で拡張することにしShadowSQLiteCursorました(これは呼び出しませんtoLowerCase):

/**
* 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);
    }
}
}

私の答えは明らかに遅すぎますが、他の人を助けるかもしれません!

于 2013-09-20T08:41:07.537 に答える