2015-10-29 1 views
2

Je travaille sur une application Android qui utilise OrmLite pour se connecter à la base de données SQLite.Utilisation de la base de données locale lors des tests avec Robolectric 3 et ORMLite

public class DatabaseHelper extends OrmLiteSqliteOpenHelper { 
... 

private static final String DATABASE_NAME = "db.sqlite"; 
private static DatabaseHelper helper = null; 

private DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, BuildConfig.DATABASE_VERSION); 
} 

public static synchronized DatabaseHelper getHelper(Context context) { 
    if (helper == null) { 
     helper = new DatabaseHelper(context); 
    } 
    return helper; 
    } 
} 

Pour récupérer les données de la DB, j'ai des classes d'aide, ils utilisent certains DAO.

public class AccountsDBHelper { 

public List<Account> getAllAccounts(Context context) { 

    DatabaseHelper dbHelper = DatabaseHelper.getHelper(context); 
    Dao<Acount, Integer> daoAccounts = dbHelper.getAccountsDao(); 
    ... 
    ... 
    ... 
     } 
} 

J'ai en place Robolectric 3 pour tester mon code, mais je vais avoir du mal à comprendre comment utiliser ensemble Robolectric avec ORMLite. Mon idée est d'avoir un faux database.sqlite dans les assets, suivant la même structure que celle que j'ai en production. Cette base de données sera pré-remplie avec les données des comptes de test, et l'utilisera pour tous mes tests. Par exemple, si je veux tester la classe ProductsProvider, je dois faire:

@RunWith(MyTestRunner.class) 
public class AccountsDBHelperTest { 

@Test 
public void testGetAllAccounts() { 
    List<Accounts> accounts= AccountsDBHelper.getAllAccounts(getTestContext()); 
    assertNotNull(accounts); 
    assertFalse(accounts.isEmpty()); 
    } 
} 

Notez que AccountsDBHelper.getAllAccounts() utilisera la DatabaseHelper, qui utilisera le db dans les actifs d'applications Android, et pas mon fichier de base de données de production locale. Comment puis-je modifier mon code des tests pour les avoir en utilisant un db local ajouté comme un atout? Sans toucher le vrai code de l'application? Toute aide sera la bienvenue, je vous remercie ...

Répondre

0

Le chaînon manquant était de pointer vers le chemin de la base de données locale String dbPath = RuntimeEnvironment.application.getPackageResourcePath() + DB_FOLDER + dbName;