我在理解如何对我的应用程序进行单元测试时遇到了困难。
让我们说我有一个公共方法publicMethod()
调用几个保存业务逻辑的私有方法。
我了解到私有方法不应该经过单元测试,所以我需要对publicMethod()
进行单元测试。
问题是我的私有方法在某些时候访问数据库。由于我不是单元测试私有方法,我无法伪造数据库调用。我能做的就是伪造私有方法调用,但是如果我伪造它,我就会失去对测试的所有兴趣,因为业务逻辑不再被测试了。
解决方案是什么,所以我可以在这种情况下对逻辑进行单元测试?
答案 0 :(得分:2)
嗯,如果没有更多的投入,很难指出解决方案,但我会尝试提供一些想法(希望他们有所帮助)。我想说,就像JamesB指出的那样,你想要对其中包含业务逻辑的所有内容进行单元测试。
从您的问题中,您可能在分离程序中的可重复性方面遇到一些麻烦。看来你有一个入口点publicMethod(),以及几个管理业务逻辑的私有方法。通过访问同一对象内的数据库,您可以将数据层耦合到业务逻辑。通过使这些方法使用数据提供程序,您可以将对象配置为从您可以控制的另一个数据源中读取,以指导您的测试,而不会使其依赖于状态。
答案 1 :(得分:1)
看一下适合你的http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html。模拟是模拟另一个单元,以便您可以坚持纯单元测试。
我假设您在2个不同的类中拥有业务逻辑和数据访问逻辑。如果没有,你应该先清理一下。切勿将业务逻辑和数据访问逻辑放在一个类中。
答案 2 :(得分:1)
这就是为什么您不应该直接在业务逻辑类中执行数据访问逻辑,而是使用一个单独的类来处理数据库访问(例如存储库)。 看看Repository & UnitOfWork Pattern
同时,您应该使用依赖注入并注入存储库的接口。然后,您可以创建此接口的模拟并伪造数据库调用,例如
var personRepositoryMock = new Mock<IPersonRepository>();
personRepositoryMock.Setup(x => x.GetPerson()).Returns(new Person());