Java 更改方法可访问性以测试它

Java 更改方法可访问性以测试它,java,unit-testing,testing,tdd,Java,Unit Testing,Testing,Tdd,我有一个调用一组私有方法的公共方法 我想用单元测试来测试每个私有方法,因为它太复杂了,无法通过公共方法测试所有东西 我们认为仅仅为了测试目的而改变方法的可访问性是一种不好的做法 但是我看不到任何其他方法来测试它(可能是反射,但它很难看)正如前面提到的,您可以将可见性从private更改为package,然后确保单元测试在同一个包中(通常情况下应该是这样) 考虑到(现在)私有函数的接口足够稳定,并且您还进行了一些集成测试(即,检查公共方法是否以正确的方式调用私有函数),这可能是测试问题的一个可接受

我有一个调用一组私有方法的公共方法

我想用单元测试来测试每个私有方法,因为它太复杂了,无法通过公共方法测试所有东西

我们认为仅仅为了测试目的而改变方法的可访问性是一种不好的做法


但是我看不到任何其他方法来测试它(可能是反射,但它很难看)

正如前面提到的,您可以将可见性从private更改为package,然后确保单元测试在同一个包中(通常情况下应该是这样)

考虑到(现在)私有函数的接口足够稳定,并且您还进行了一些集成测试(即,检查公共方法是否以正确的方式调用私有函数),这可能是测试问题的一个可接受的解决方案

但是,您可能还需要考虑其他一些选项:

    <> LI>如果私有函数是接口稳定但足够复杂的,则可以考虑为它们创建单独的类-很可能它们中的一些可能受益于被分割成几个较小的函数本身。
  • 如果通过公共接口测试私有函数不方便(可能是因为需要复杂的设置),有时可以通过使用帮助函数来解决这一问题,帮助函数可以简化设置并允许不同的测试共享公共设置代码

如前所述,您可以将可见性从private更改为package,然后确保单元测试在同一个包中(通常情况下应该是这样)

考虑到(现在)私有函数的接口足够稳定,并且您还进行了一些集成测试(即,检查公共方法是否以正确的方式调用私有函数),这可能是测试问题的一个可接受的解决方案

但是,您可能还需要考虑其他一些选项:

    <> LI>如果私有函数是接口稳定但足够复杂的,则可以考虑为它们创建单独的类-很可能它们中的一些可能受益于被分割成几个较小的函数本身。
  • 如果通过公共接口测试私有函数不方便(可能是因为需要复杂的设置),有时可以通过使用帮助函数来解决这一问题,帮助函数可以简化设置并允许不同的测试共享公共设置代码

你是对的,改变方法的可见性只是为了能够测试它们是一件坏事。以下是您的选项:

通过现有的公共方法进行测试。您确实不应该测试方法,而应该测试行为,因为行为通常需要多种方法。因此,停止考虑测试该方法,而是找出未测试的行为。如果您的类设计良好,那么它应该易于测试

将方法移动到新类中。从设计角度来看,这可能是解决问题的最佳方案。如果您的代码非常复杂,以至于无法访问该私有方法中的所有路径,那么它的一部分可能应该存在于它们自己的类中。在该类中,它们至少具有包范围,并且可以轻松地进行测试。再次强调:您仍然应该测试行为而不是方法

使用反射。您可以使用反射访问私有字段和方法。虽然这在技术上是可能的,但它只是将更多的遗留代码添加到现有的遗留代码中,以隐藏遗留代码。总的来说,这是一件相当愚蠢的事情。这方面也有例外。例如,出于某种原因,您甚至不能对产品源代码进行最小的更改。如果你真的需要这个,谷歌它


只需更改可见性即可是的,这是一种不好的做法。但有时替代方案是:在不进行测试的情况下进行大的更改,或者根本不进行测试。所以有时候,咬紧牙关改变能见度是可以的。特别是当它是编写一些测试的第一步,然后在它自己的类中提取行为时。

您是对的,更改方法的可见性只是为了能够测试它们是一件坏事。以下是您的选项:

通过现有的公共方法进行测试。您确实不应该测试方法,而应该测试行为,因为行为通常需要多种方法。因此,停止考虑测试该方法,而是找出未测试的行为。如果您的类设计良好,那么它应该易于测试

将方法移动到新类中。从设计角度来看,这可能是解决问题的最佳方案。如果您的代码非常复杂,以至于无法访问该私有方法中的所有路径,那么它的一部分可能应该存在于它们自己的类中。在该类中,它们至少具有包范围,并且可以轻松地进行测试。再次强调:您仍然应该测试行为而不是方法

使用反射。您可以使用反射访问私有字段和方法。虽然这在技术上是可能的,但它只是将更多的遗留代码添加到现有的遗留代码中,以隐藏遗留代码。总的来说,这是一件相当愚蠢的事情。这方面也有例外。例如,出于某种原因,您甚至不能对产品源代码进行最小的更改。如果你真的需要这个,谷歌它


只需更改可见性即可是的,这是一种不好的做法。但有时替代方案是:在不进行测试的情况下进行大的更改,或者根本不进行测试。所以有时候,咬紧牙关改变能见度是可以的。特别是当它是编写一些测试的第一步,然后在它自己的类中提取行为时。

私有方法应该只作为重构公共方法的结果而存在,即