如何在不测试调用数据库的私有方法的情况下进行单元测试

本文关键字:有方法 情况下 单元测试 数据库 测试 调用 | 更新日期: 2023-09-27 18:32:58

我在理解如何很好地对我的应用程序进行单元测试时遇到了困难。

假设我有一个公共方法publicMethod()调用几个保存业务逻辑的私有方法。我了解到私有方法不应该进行单元测试,所以我需要对publicMethod()进行单元测试。

问题是我的私有方法在某些时候访问数据库。由于我没有对私有方法进行单元测试,因此我无法伪造数据库调用。我能做的是伪造私有方法调用,但是如果我伪造它,我将失去对测试的所有兴趣,因为不再测试业务逻辑。

在这种情况下,

我可以对逻辑进行单元测试的解决方案是什么?

如何在不测试调用数据库的私有方法的情况下进行单元测试

好吧,如果没有更多输入,很难指出解决方案,但我会尝试提供一些想法(希望它们有所帮助)。我想说的是,正如JamesB指出的那样,你想要对包含业务逻辑的所有内容进行单元测试。

从您的问题来看,也许您在分离程序中的响应性时遇到了一些麻烦。似乎你有一个入口点 publicMethod(),以及几个管理业务逻辑的私有方法。通过访问同一对象中的数据库,可以将数据层耦合到业务逻辑。通过使这些方法改用数据提供程序,可以将对象配置为从可以控制的另一个数据源读取,以指导测试,而不会使其依赖于状态。

看看最适合你的 http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html。模拟是模拟另一个单元,以便您可以坚持纯单元测试。

我在这里假设您的业务逻辑和数据访问逻辑在 2 个不同的类中。如果没有,您可能应该先清理一下。永远不要将业务逻辑和数据访问逻辑放在一个类中。

这就是为什么您不应该直接在业务逻辑类中执行数据访问逻辑,而应该有一个单独的类来处理数据库访问(例如存储库)。查看存储库和工作单元模式

同时,您应该使用依赖注入并注入仓库的接口。然后,您可以创建此接口的模拟并伪造数据库调用,例如

var personRepositoryMock = new Mock<IPersonRepository>();
personRepositoryMock.Setup(x => x.GetPerson()).Returns(new Person());
相关文章: