对于测试私有(private)方法的意义,众说纷纭,如here和 here .我个人认为是有道理的,问题是如何正确地去做。
在 C++ 中,您可以使用 #define
hack或者使测试类成为 friend
,在 C# 中有 InternalsVisibleToAttribute , 但在 Java 中我们要么必须使用 reflection或使它们“对测试可见”和annotate them as such为了明确意图。两者的缺点应该很明显。
我认为应该有更好的东西。开始于
public class Something {
private int internalSecret() {
return 43;
}
}
如果能够像这样在测试代码中调用私有(private)方法就好了
@MakeVisibleForTesting Something something = new Something();
Assert.assertEquals(43, something.internalSecret());
这里的注解会使用反射悄悄地将所有调用转换为 something
的私有(private)方法。我想知道 Lombok可以做到(并会询问作者)。
很可能做那么多魔术被证明太复杂了,而且无论如何都需要一些时间,所以我正在寻找一些替代方法。也许用 @Decapsulate
之类的东西注释被测类,并使用注释处理器生成类 Decapsulated_Something
看起来像
public class Decapsulated_Something {
public Decapsulated_Something(Something delegate) {
this.delegate = delegate
}
public boolean internalSecret() {
// call "delegate.internalSecret()" using reflection
}
...
}
允许使用
Decapsulated_Something something = new Decapsulated_Something(new Something());
Assert.assertEquals(43, something.internalSecret());
我对注解处理经验不多,先在这里问一下:
- 这实现起来有多复杂?
- 我忘记了什么?
- 您总体上怎么看?
最佳答案
做这个实现好像很麻烦。这可能不值得。而只是将方法包设置为默认值。
但是,如果你确定调用私有(private)方法,你可以使用setAccessible在您的Decapsulated_something
类中允许通过反射调用。所以这很简单。
关于用于测试私有(private)方法的 Java 工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7073863/