Java解耦数据库操作代码并使其可测试

wei

我想为以下方法编写测试

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方法,而不是测试所使用类的行为。

在我的例子,我注入DatabaseHelperItemManager通过构造函数,但你可以使用任何方法:构造函数,setter方法,依赖注入框架等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数据与代码解耦

来自分类Dev

Java设计:解耦JNI库

来自分类Dev

Java设计:解耦JNI库

来自分类Dev

解耦服务调用和数据库存储

来自分类Dev

数据库单元:测试插入和更新操作

来自分类Dev

与数据库交互而不在数据库中创建数据的单元测试代码

来自分类Dev

数据库操作

来自分类Dev

Spring测试从代码初始化数据库

来自分类Dev

更好地在mvc中组织数据库操作代码

来自分类Dev

在数据库中存储/检索JSON字符串,使其易于在代码中使用

来自分类Dev

如何将 String 转换为 java.util.date 以使其可插入到类型为“DATE”的 mysql 数据库列中?

来自分类Dev

测试涉及数据库

来自分类Dev

如何使用Java测试与Oracle数据库的连接

来自分类Dev

使用XML数据库测试Java类

来自分类Dev

异步数据库操作

来自分类Dev

开玩笑-如何重组代码以使其可测试?

来自分类Dev

事件真的会使代码解耦吗?

来自分类Dev

事件真的会使代码解耦吗?

来自分类Dev

执行存储在数据库中的Java代码

来自分类Dev

在微服务上解耦数据库的原因是什么?

来自分类Dev

从Java中的应用程序解耦第三方代码

来自分类Dev

从Java中的应用程序解耦第三方代码

来自分类Dev

Django可重用包-测试数据库不是即时创建的

来自分类Dev

Django可重用包-测试数据库不是即时创建的

来自分类Dev

当pytest测试断言查询结果行数失败时,数据库操作挂起

来自分类Dev

如何防止TestNg + Spring + H2数据库中每个测试的回滚操作?

来自分类Dev

@DataJpaTest中不执行插入测试数据库的操作

来自分类Dev

如何编写需要可操作的mySQL数据库的测试模块?

来自分类Dev

当pytest测试断言查询结果行数失败时,数据库操作挂起

Related 相关文章

热门标签

归档