unit-testing - 将私有(private)方法更改为 protected 或包私有(private)以进行单元测试 - 好还是坏?

标签 unit-testing tdd

我正在研究 TDD,最近正在寻找如何正确地对私有(private)方法进行单元测试。 Stack Overflow 中的热门答案建议:

  • 使用反射使私有(private)方法可以从外部访问。 1
  • 不要测试私有(private)方法。 (改为使用公共(public)方法。)1 2 3

根据评论区的分歧,似乎每个人都有自己的规则。然后我找到了这个 tutorial site这表明一种相当大胆的方法。

  • 使私有(private) 方法 protected 包私有(private)。将测试代码放在同一个包中。

    Designing for testability means designing your code so that it is easier to test. To do so, you may have to break with some of the principles we learned in university, like encapsulation.

尽管 TDD 的原则是为可测试性设计代码,但为此打破封装对我来说并不合适。这种方法是好的做法吗?

最佳答案

我认为正确的答案是:不要测试私有(private)方法。 如果您觉得需要测试私有(private)方法,可能会出现以下两种情况之一:

  • 该方法不必是私有(private)的:也许可以通过其所在对象的 API 访问该方法。在这种情况下,将其更改为公开(或任何其他非私有(private))。另一种选择是将方法的行为放在另一个对象的公共(public)方法中,并为其构建一些专用测试;
  • 该方法必须是私有(private)的,因此您正在测试不应该进行的测试。您正在尝试编写与您正在测试的对象过于耦合的测试。根据定义,私有(private)方法并不稳定,它们会随着时间的推移而频繁变化。这些更改将破坏所有直接验证私有(private)方法的测试。

关于unit-testing - 将私有(private)方法更改为 protected 或包私有(private)以进行单元测试 - 好还是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40582252/

相关文章:

javascript - 如何在我的案例中测试 http 请求

php - TDD Laravel - laravel 和 spatie/laravel-activitylog 中的功能测试得到 JSON 编码错误

tdd - TDD,如何编写即使对象不存在也可以编译的测试

android - Android 中 Cocos2d-X 的 TDD

testing - 如果我的项目需求不断变化,我应该使用测试用例吗?

python - 获取模拟 file.read() 的实际返回值

python - 如何使用 python 的 GAE 开发服务器测试台模拟文件上传到 blobstore

unit-testing - PHPUnit 排除 Getter 和 Setter

android - 如果存在自定义 View ,Robolectric 无法扩充布局文件

unit-testing - Visual Studio 中用于 Angular 2 开发的单元测试 Typescript