如何使用 VisibleForTesting 进行纯 JUnit 测试

问题描述 投票:0回答:4

我正在项目中的纯java文件上运行纯JUnit4 java测试,但我找不到一种方法来清楚地使用@VisibleForTesting,而无需手动公开该内容。

例如:

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

该方法必须是

public
才能让它对测试“公开”,但在这种情况下,注释没有意义,对吧?如果注释不起作用,为什么不直接使用注释呢?

java android junit junit4 android-testing
4个回答
67
投票

将方法设为包私有,如果测试位于相应的测试包中(与生产代码相同的包名称),则测试将能够看到它。

@VisibleForTesting
Address getAddress() {
  return mAddress;
}

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

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


38
投票

根据Android文档

如果不是为了测试,您可以选择指定可见性应该是什么;这允许工具捕获生产代码中的意外访问。

示例:

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

35
投票

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

为了降低直接使用它的风险,请将此方法添加为

Kotlin
中的internal
Java
中的protected而不是
public
,这样只有同一包中的测试或类才会被使用。能够访问该方法。

Java:

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

科特林:

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

10
投票

@VisibleForTesting
注释用于 Guava 中的包方法中,并且不属于 JUnit API 的一部分。注解只是一个标记,表明该方法可以被测试。它甚至没有被加载到 JVM 中。

© www.soinside.com 2019 - 2024. All rights reserved.