【问题标题】:Changing Private Method Sign with Public for Unit Testing使用公共更改私有方法符号以进行单元测试
【发布时间】:2020-08-23 23:23:56
【问题描述】:

我知道用 public 改变私有方法的符号忽略封装原则。此外,私有方法是一个实现细节。但是我想知道如果该方法不影响或破坏系统的其他部分,我可以公开该方法的签名吗?

例如;

我有一个包含 switch-case 块的方法;

private Object foo(Object object, MyTypeEnum type) {
    ....
    switch(type) {
      case type.x:
         return "a";
     case type.y:
         return "b";
     case type.z:
         return "c";
     .
     .
     .
  }
  ..
 }

另外;

  • 移动 utils 类中的方法以使其符号公开是不好的做法,因为该方法不是通用且可重用的
  • 测试调用私有方法(foo) 的公共方法是一种解决方案。但是,我的代码库有很多遗留和未经测试的代码,所以我必须更改其他类和方法。此外,我没有足够的时间重构代码库的其他部分。

你对这个案子有什么建议?

【问题讨论】:

  • 当然可以,但需要注意的是,一旦公开,它就是公开的。它已经是一个可疑的方法,因为它返回Object。问题是 1) 应该 您,2) 是否有 其他 测试(单元或集成)已经测试过这种行为,以及 3) 测试这种行为的投资回报率是否值得.这些问题没有通用的答案;这在很大程度上取决于上下文。 (不相关,但return 之后的break 是多余且毫无意义的。)artima.com/suiterunner/private.html

标签: java unit-testing testing junit


【解决方案1】:

您已经知道这不是一种好的形式,但是由于这些确切的原因,尝试测试工作但未经测试的遗留代码通常不是一种好的时间投资。您不想花费很长时间来改造旧的东西只是为了添加测试;它实际上增加了在生产中发生意外事件的风险。见Adding unit tests to legacy code

在这种情况下,我总是尝试在更高级别而不是单个类中的单个方法进行测试。

【讨论】:

  • 完全同意。这是指向亚马逊的货币化链接吗?
  • 原来是这样!只是不是你的钱。 meta.stackoverflow.com/questions/388746/…
  • 我现在已经删除了那个链接。这是我的信息:当您需要使用遗留代码时,请确保您始终拥有一份“使用遗留代码”的副本
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多