当前位置: 首页 > 知识库问答 >
问题:

单元测试(模拟)数据库,如何用模拟验证数据库方法?

张宝
2023-03-14

由于一个人在单元测试和模拟之前没有经验,我使用Mockito学习了关于JUnit的初学者教程,并进行了一些实践。

现在,我需要对一些在MySQL数据库上执行基本数据库操作的类方法进行单元测试。我不想对数据库进行真正的更改。

@InjectMocks private DBConnection dbConnection;
@Mock private DBConnection mockDBConnection;

@Test
public void testDropTable() {

    Mockito.when(mockDBConnection.dropTable()).thenReturn(0);

    // dropTable() returns 0 if table dropped
    int result = dbConnection.dropTable();
    Assert.assertEquals(result, 0);
}

在不访问真实数据库的情况下,是否存在验证类似方法的方法?还是我误解了单元测试和嘲笑的概念?

共有1个答案

巴洲
2023-03-14

想象一下下面的情况...你有两辆车,一辆是真车,另一辆是假车。现在你钻进真车开走了。你为什么指望不动?你没有对假车做任何事情,所以即使你告诉它“如果我开始开车就不要动”,这也不能改变当你开车离开时真车会动的事实。

这里同样,您创建了一个假的DBConnection和一个真的DBConnection。真正的人会做任何真正的人做的事。假的可以被配置为执行不同的任务,就像使用Mockito.when(...)一样。但这并不能改变真正的人的行为。

你的测试实际上是毫无意义的,因为你在这里唯一的选择是摆脱模拟,因为它没有任何有意义的目的。您不能测试模拟。为什么?这就像制造一辆假车并进行测试--它不会告诉你任何关于真车的事情。你不需要测试假车来发现如果你告诉它在测试中做X,它会做X。

最后,您只能通过连接到一个db来完全测试db连接。其他一切都不是完全的考验。

 类似资料:
  • 问题内容: 我正在用Java编程,而我的应用程序正在大量使用DB。因此,对我来说重要的是能够轻松测试数据库的使用情况。 什么是DB测试?对我来说,他们应该提供两个简单的要求: 验证SQL语法。 更重要的是,根据给定情况检查数据是否正确选择/更新/插入。 那么,看来我只需要一个DB。 但实际上,我不喜欢这样做,因为使用数据库进行测试几乎没有困难: “只给自己一个测试数据库,这有多难?” -嗯,在我的

  • 我正在尝试对服务方法进行单元测试。服务方法调用spring数据存储库方法来获取一些数据。我想模拟这个存储库调用,并自己提供数据。如何做到这一点?在Spring Boot文档之后,当我模拟存储库并在测试代码中直接调用存储库方法时,模拟工作正常。但是,当我调用服务方法时,反过来调用存储库方法,mocking就不起作用了。下面是示例代码: 服务级别: 测试等级:

  • 我有一个问题与存根我的存储库。有人建议我只创建另一个application.properties(我没有这样做),并使用像H2这样的内存数据库。不过,我想知道我是否可以只是存根调用,这样当调用MyDataService.FindById(id)而不是试图从数据库中获取它时,就可以返回一个模拟对象?

  • 问题内容: 我如何在我的node.js应用程序中模拟数据库,在本例中将其用作博客REST API的后端? 当然,我可以将数据库设置为特定的数据库,但是我仍然会保存数据,不仅要测试我的代码,还要测试数据库,所以我实际上不是在进行单元测试,而是在进行集成测试。 那该怎么办?创建数据库包装程序作为应用程序和数据库之间的中间层,并在测试时替换DAL? 问题答案: 我认为如果不使用数据库软件进行测试,就无法

  • 问题内容: 我希望在编写用于测试某些数据库条目的单元测试中获得一些建议。 如果找不到记录,则我正在测试的功能会将数据库作为种子。 我似乎不太了解如何进行len测试。我正在使用测试数据库,因此我可以在任何时候都对其进行核对,因此,如果我只需要在函数上强制使用一个空的数据库,就没有问题了。 该函数本身可以正常工作,我只想确保已覆盖该函数。 任何建议都很好。 谢谢! 问题答案: 确实取决于您,有很多方法

  • 现在,当调用“/comments/1”时,我得到了404个错误,所以数据rest没有公开我的存储库。主要问题是“如何模拟存储库方法从数据库中获取数据?” 我的测试类: 据我所知,使用MockBean注释我替换了当前的存储库bean并且它不会被数据rest公开,我们有没有办法将数据预填充到db或存储库方法的模拟调用?