如何在不测试调用数据库的私有方法的情况下进行单元测试
本文关键字:有方法 情况下 单元测试 数据库 测试 调用 | 更新日期: 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());