让我们说恰好是一个现有的长私有方法(其中一个我不允许在开发过程的这个阶段重构成小块)但我真的想写一些回归 - 保护单元测试,就在现在。
我刚刚听说过这个@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都会发出一个警告,警告其他开发人员不要意外地将测试方法用于他们的实际代码
答案 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 适用于阅读代码的人。在这两种情况下,让生活的程序员更容易。
希望这有帮助:)