2012-01-06 67 views
5

我试图采用TDD方法创建Android应用程序。我正在使用ORMLite和Mockito/Robolectric进行测试。我碰到麻烦测试一个简单的事情:(在某些类包装了DAO调用方法)测试类通过ORMLite的DAO与数据库通信

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

,里面的代码将只是一个合适的查询方法调用。

什么是测试代码的最佳方法?我一直在考虑这个问题,但是如果不访问真实的数据库(无论是真实还是测试数据库),都不会想到解决方案。

欢迎任何建议。

+0

用于TDD的+1,以及robolectric/mockito组合。 – 2013-01-11 07:11:20

回答

2

Hrm。这取决于你如何创建你的Dao类。在ORMLite下,Dao类是一个接口,这意味着只需一点接线,就可以注入一个模拟的DAO,并通过模拟处理查询调用。

例如,你可以有你的包裹类八九不离十一个setDao方法是这样的:

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; 
} 

然后你getTasksForNextTwoWeeks()方法会做这样的事情:

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

但是这需要一个好一点模拟得到QueryBuilder

我们所做的是扩展ORMLIte Dao接口并将getTasksForNextTwoWeeks()等方法添加到ITaskDao类。

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

然后你可以很容易地模拟出ITaskDao并绕过所有的数据库操作。

希望这会有所帮助。

+0

现在我想知道,如果最好将DAO作为一个单元进行测试,或者先用DB进行集成测试。嘲笑QueryBuilder看起来像一个过度复杂。 – LordTwaroog 2012-01-08 01:40:02

+0

同意。我推荐你的大部分程序来模拟Dao,正如我所提到的。但是你仍然需要测试'ITaskDao'类。 – Gray 2012-01-08 20:53:13

4

我不是格雷的回应,因为它使事情有点太复杂。 我建议你简单地创建内存数据库,而不是由空传递的数据库名称:

OrmLiteSqliteOpenHelper(context,null, null, DATABASE_VERSION); 

这样,你可以通过 测试您的查询单测试)将模拟元素 B)试验,如果你的SqliteOpenHelper包装器返回正确的结果

这样的每一个测试都完全独立于你的套件中的实际数据库和其他测试。