我想为以下方法编写测试:
public void addItem(Item item) {
items.add(0, item);
DatabaseHelper.getInstance().writeOneItem(item);
}
该类称为ItemManager,其职责是管理用户可以保存到列表或从列表中删除的Items。它应该与Sqlite数据库保持一致,该数据库保留列表中的项目。
当DatabaseHelper
(ormlite)没有被初始化时init(Context context)
(通常在我的Andoid应用启动时就被调用了,但是在我的测试中没有完成),它的getInstance()
方法将返回null
并且上面的方法执行将崩溃。
我应该在这里做什么?我可以init(Context context)
从测试中调用,也可以DatabaseManager.getInstance()
在调用任何内容之前检查是否为null。但这似乎更像是一种解决方法。在我看来,我不应该在这种方法中执行任何数据库工作,并尝试尽可能地将ItemManager与数据库分开。
关于理想解决方案的外观的任何想法,不是从具体实现的形式而是从总体设计的角度来看的?
我是单元测试的新手,并且很难将彼此分离。
我认为,您的班级ItemManager
必须调用DatabaseHelper
来编写该项目,但是您的单元测试只是想确保它可以完成。您不想测试DatabaseHelper
实际在数据库中写入了该项,那将是另一项测试。
我将修改您的类的设计:DatabaseHelper.getInstance()
不应直接在方法中完成。您ItemManager
应该拥有实例的私有字段DatabaseHelper
。这样,您可以模拟它并验证它是否被调用。
以Mockito为例:
public void addItem(Item item) {
items.add(0, item);
this.databaseHelper.writeOneItem(item);
}
@Test
public void my_test() {
// GIVEN
DatabaseHelper databaseHelper = mock(DatbaseHelper.class);
ItemManager manager = new ItemManager(databaseHelper);
Item item = new Item()
// WHEN
manager.addItem(item);
// THEN
verify(databaseHelper).writeOneItem(item); // This verifies that the method writeOneItem of the "mock" is called with the "item" parameter
}
// Another test would check that the item is added to the "items" collection
您的单元测试应专注于测试ONE方法,而不是测试所使用类的行为。
在我的例子,我注入DatabaseHelper
在ItemManager
通过构造函数,但你可以使用任何方法:构造函数,setter方法,依赖注入框架等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句