如何使用 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;
}
我是 运行 纯 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;
}