如何使用 VisibleForTesting 进行纯 JUnit 测试

How to use VisibleForTesting for pure JUnit tests

我是 运行 纯 JUnit4 java 在我的项目中测试我的纯 java 文件,但我找不到使用 @VisibleForTesting 的方法手动制作东西 public.

例如:

@VisibleForTesting
public Address getAddress() {
  return mAddress;
}

该方法必须是 public 才能让它成为 "public" 才能测试,但在那种情况下注释没有意义,对吗?如果注释什么都不做,为什么不直接使用注释呢?

将方法设为 package-private,如果测试在相应的测试包中(与生产代码的包名相同),测试将能够看到它。

@VisibleForTesting
Address getAddress() {
  return mAddress;
}

同时考虑重构您的代码,这样您就不需要显式测试私有方法,尝试测试 public 接口的行为。难以测试的代码可能表明可以对生产代码进行改进。

注释的要点在于它的约定,可以用于静态代码分析,而注释不能。

@VisibleForTesting 注释在 Guava package-methods 中使用,而不是 JUnit API 的一部分。注释只是一个标记,表示可以测试该方法。它甚至没有加载到 JVM 中。

根据 Android docs:

You can optionally specify what the visibility should have been if not for testing; this allows tools to catch unintended access from within production code.

示例:

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
public Address getAddress()

标签本身有助于 linter 识别不需要的访问。

为了降低直接使用它的风险,将此方法添加为 Kotlin 中的 internal[=27 中的 protected =] 而不是 public 并且只有同一包中的测试或 类 才能访问该方法。

Java:

@VisibleForTesting
protected Address address() {
  return mAddress;
}

科特林:

@VisibleForTesting
internal fun address(): Address {
  return address;
}