【发布时间】:2011-10-27 18:45:09
【问题描述】:
对于测试私有方法的意义有不同的看法,例如here和here。我个人认为这是有道理的,问题是如何正确地做到这一点。
在 C++ 中,您可以使用 #define hack 或创建测试类 friend,在 C# 中有 InternalsVisibleToAttribute,但在 Java 中我们必须使用 reflection 或使它们“对测试可见”和 annotate them as such为了明确意图。两者的缺点应该很明显了。
我认为应该有更好的东西。以
开头public class Something {
private int internalSecret() {
return 43;
}
}
如果能在测试代码中调用私有方法就好了
@MakeVisibleForTesting Something something = new Something();
Assert.assertEquals(43, something.internalSecret());
这里的注解将使用反射静默地将所有调用转换为something 的私有方法。我想知道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());
我对注解处理没有太多经验,所以在这里先问一下:
- 实现起来有多复杂?
- 我忘记了什么?
- 您对此有何看法?
【问题讨论】:
-
你是在问一个工具,还是自己写一个?
-
@Raedwald 我在问如何解决它。绞尽脑汁是一种选择,但并不明确需要重新发明轮子。
标签: java testing reflection private