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

Java 如何在不测试调用数据库的私有方法的情况下进行单元测试,java,c#,unit-testing,microsoft-fakes,Java,C#,Unit Testing,Microsoft Fakes,我在理解如何很好地对我的应用程序进行单元测试时遇到了困难 假设我有一个公共方法publicMethod()调用了几个保存业务逻辑的私有方法。 我了解到私有方法不应该进行单元测试,所以我需要进行单元测试publicMethod() 问题是我的私有方法在某个点访问数据库。因为我没有对私有方法进行单元测试,所以我不能伪造数据库调用。我可以做的是伪造私有方法调用,但是如果我伪造它,我就失去了对测试的所有兴趣,因为业务逻辑不再被测试 在这种情况下,我可以单元测试逻辑的解决方案是什么?好吧,如果没有更多的输

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

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

问题是我的私有方法在某个点访问数据库。因为我没有对私有方法进行单元测试,所以我不能伪造数据库调用。我可以做的是伪造私有方法调用,但是如果我伪造它,我就失去了对测试的所有兴趣,因为业务逻辑不再被测试


在这种情况下,我可以单元测试逻辑的解决方案是什么?

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


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

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

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

看看哪种方法最适合您。Mocking是模拟另一个单元,以便您可以坚持纯单元测试

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

看看哪个最适合您。Mocking是模拟另一个单元,以便您可以坚持纯单元测试


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

这就是为什么不应该直接在业务逻辑类中执行数据访问逻辑,而应该使用一个单独的类来处理数据库访问(例如存储库)。 看一看

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

var personRepositoryMock = new Mock<IPersonRepository>();
personRepositoryMock.Setup(x => x.GetPerson()).Returns(new Person());
var personRepositoryMock=new Mock();
personRepositoryMock.Setup(x=>x.GetPerson()).Returns(newPerson());

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

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

var personRepositoryMock = new Mock<IPersonRepository>();
personRepositoryMock.Setup(x => x.GetPerson()).Returns(new Person());
var personRepositoryMock=new Mock();
personRepositoryMock.Setup(x=>x.GetPerson()).Returns(newPerson());

“我学到了私有方法不应该进行单元测试”我认为你严格来说不是这个意思。您的测试应该测试您编写的业务逻辑。您所说的“伪造”到底是什么意思?你能添加一个代码示例吗?您使用过模拟框架吗?它被称为模拟,如果该方法在其模拟之外没有任何功能,则它是委托的,并且不必进行单元测试。如果您在单元测试方面有问题,则您的软件设计通常会有问题。在不了解具体设计的情况下,很难提供解决方案,但也许可以将数据库访问提取到另一个实现接口的类中。然后,您可以在单元测试中模拟这个接口。您可以对私有方法进行单元测试,但可以通过测试调用它们的公共方法来实现。因此,是的,伪造私有方法不会有多大帮助。您需要的是一种模拟来自私有方法的数据库调用的方法。因此,要么将一个连接注入到一个测试数据库,该数据库的内容由您完全控制,要么将数据库调用抽象出来并模拟这些调用。“我知道私有方法不应该进行单元测试”我认为您严格意义上不是这个意思。您的测试应该测试您编写的业务逻辑。您所说的“伪造”到底是什么意思?你能添加一个代码示例吗?您使用过模拟框架吗?它被称为模拟,如果该方法在其模拟之外没有任何功能,则它是委托的,并且不必进行单元测试。如果您在单元测试方面有问题,则您的软件设计通常会有问题。在不了解具体设计的情况下,很难提供解决方案,但也许可以将数据库访问提取到另一个实现接口的类中。然后,您可以在单元测试中模拟这个接口。您可以对私有方法进行单元测试,但可以通过测试调用它们的公共方法来实现。所以,是的,实际上,伪造私有方法不是goi