2012-01-06 13 views
5

Próbuję zastosować podejście TDD w tworzeniu aplikacji dla systemu Android. Używam ORMLite i Mockito/Robolectric do testowania. Zabrakło mi w kłopoty testowania prostą rzecz:Testowanie klasy komunikującej się z DB za pomocą ORMLite DAO

(metoda w jakiejś klasie owijania DAO nazywa)

public List<ITask> getTasksForNextTwoWeeks() throws SQLException { 
    // Code to be written 
} 

dobrze, kod wewnątrz będzie tylko właściwe wywołanie metody zapytania.

Jakie jest najlepsze podejście do testowania tego kodu? Myślałem o tym, ale nie potrafię wymyślić rozwiązania bez uzyskania dostępu do prawdziwej bazy danych (zarówno rzeczywistej, jak i testowej).

Wszelkie sugestie mile widziane.

+0

+1 dla TDD i komendy robolectric/mockito. –

Odpowiedz

2

Hrm. To zależy trochę od tego, jak tworzysz swoją klasę Dao. Pod ORMLite, klasa Dao to interfejs, który oznacza, że ​​przy odrobinie okablowania, powinieneś być w stanie wstrzyknąć wyśmiewanego DAO i po prostu obsłużyć kwerendy przez próbę.

Na przykład można mieć setDao metody na swojej owijania klasy coś w stylu tego:

public void setDao(Dao<ITask, String> dao) { 
    this.dao = dao; 
} 

private Dao<ITask, String> getDao() { 
    if (dao != null) { 
     // typical ORMLite pattern 
     dao = getHelper().getITaskDao(); 
    } 
    return dao; 
} 

Następnie metoda getTasksForNextTwoWeeks() zrobi coś takiego:

public List<ITask> getTasksForNextTwoWeeks() throws SQLException { 
    QueryBuilder<ITask, String> qb = getDao().getQueryBuilder(); 
    qb.where().gt(...); 
    return qb.query(); 
} 

Wymaga to jednak sporo drwiny, aby uzyskać QueryBuilder.

Co możemy zrobić, to rozszerzyć interfejs ORMLIte Dao i dodać metody takie jak getTasksForNextTwoWeeks() do klasy ITaskDao.

public interface ITaskDao extends Dao<ITask, String> { 
    public List<ITask> getTasksForNextTwoWeeks() throws SQLException; 
    ... 
} 

Następnie można łatwo wyśmiewać ITaskDao i ominąć wszystkie operacje bazy danych.

Mam nadzieję, że to pomoże.

+0

Zastanawiam się teraz, czy lepiej jest przetestować DAO jako jednostkę lub przeprowadzić test integracyjny z DB z przodu. Prześmiewanie QueryBuilder wygląda na nadmierną komplikację. – LordTwaroog

+0

Uzgodnione. Polecam, aby większość twojego programu kpiła z Dao, o czym wspomniałem. Ale nadal będziesz musiał przetestować klasę 'ITaskDao'. – Gray

4

Nie jestem zwolennikiem odpowiedzi Graya, ponieważ czyni to trochę zbyt skomplikowanym. polecam Ci po prostu stworzyć bazę danych w pamięci zamiast, przekazując null jako nazwa bazy danych:

OrmLiteSqliteOpenHelper(context,null, null, DATABASE_VERSION); 

W ten sposób można sprawdzić swoje zapytania w pojedynczym teście przez a) dodanie elementów makiety b) badanie, czy Twój SqliteOpenHelper -wrapper zwraca poprawne wyniki

Każdy taki test jest całkowicie niezależny od rzeczywistej bazy danych i innych testów w twoim pakiecie.

Powiązane problemy