用于测试私有(private)方法的 Java 工具?

标签 java testing reflection private

对于测试私有(private)方法的意义,众说纷纭,如herehere .我个人认为是有道理的,问题是如何正确地去做。 在 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/

相关文章:

java - 使用 Play Framework 和第三方 API 流式传输大文件

java - 使用java发送电子邮件时出错

java - 使用 BufferedReader 读取文本文件

java - HTTP服务器: Java dynamic method invocation as an alternative to if conditionals

c# - EF5 ObjectContext : How to replace IQueryable<T>. 包含(路径)与 context.T.Attach()

Java - 使用反射获取对静态类的引用

java - 如何将参数从另一个类传递给非静态方法?

java - Testng 中带有数组 arraylist 的数据提供者

python - 如何使用 python3、CircleCI 和 Mayavi 对图形进行单元测试

php - 期望很长时如何编写单元测试