@VisibleForTesting和@Deprecated int单元测试之间的区别

时间:2014-04-10 04:10:18

标签: java android unit-testing

让我们说恰好是一个现有的长私有方法(其中一个我不允许在开发过程的这个阶段重构成小块)但我真的想写一些回归 - 保护单元测试,就在现在。

我刚刚听说过这个@VisibleForTesting注释,但我不太清楚它的好处和缺陷。以前,我一直用@Deprecated和评论来标记事物,并试着让它变得非常清晰:

... some code ...
    // ====================================== TESTING USE ONLY BELOW  ======================================
@Deprecated // TESTING ONLY, DO NOT USE!
boolean testGiveAccessToSomethingPrivate() {
    // call some private method and get the results
}

似乎每当我标记为@VisibleForTesting时,它似乎都暴露了realz的方法,而没有向API的用户表明该方法仅用于测试...(而如果我标记使用@Deprecated的方法,大多数IDE都会发出一个警告,警告其他开发人员不要意外地将测试方法用于他们的实际代码

1 个答案:

答案 0 :(得分:3)

<强> @Deprecated

当方法标记为 @Deprecated 时,程序员使用此方法会知道可能会删除这种方法,在将来的版本中会有不同的行为。如果发生这种情况,您的代码将被破坏,您将返工。所以,他们应该非常小心地使用这个功能,或者应该用其他功能代替。 (制作这个api的程序员通常会在不弃用的情况下制作另一个类似的函数)。

<强> @VisibleForTesting

您已经了解了public private protected ...并且您使用得很好。但在现实世界中,一切都不如我们的想象。例如,你的类有一个私有变量,你想测试这个变量,怎么可以?

class SimpleClass() {
   private int a;

   public simpleMethod() {
       if (a < 0) {
          // do something
       } else {
          // do another thing
       }
   }
}

一种方法是将变量a的范围更改为包级别,因为您的测试文件将与要测试的文件的包相同。但是另一个程序员跳进去,他们会问自己:&#34;为什么有人把修饰符放在包级别?我认为私人水平更好&#34;。 (当然,他们不知道或不介意阅读您的测试代码,因为生活太忙了)。因此,您可以使用 @VisibleForTesting 让他们知道。他们读了这篇文章和谷歌知道:&#34;啊啊,我明白了。他希望这个变量是可测试的&#34;。

这是关于这两个注释的非常简短的故事。类似的是:他们不会改变代码的运行方式。没有改变任何东西,但通知其他人知道一些事情。每个Java开发人员都知道并且类似的非常着名的注释是 @Override

不同之处在于: @Deprecated 适用于使用您代码的人, @VisibleForTesting 适用于阅读代码的人。在这两种情况下,让生活的程序员更容易。

希望这有帮助:)