【问题标题】:How to do package-private classes visible for other one package only?如何仅对其他一个包可见包私有类?
【发布时间】:2017-02-10 22:46:53
【问题描述】:

我想实现具有最佳封装的包,但要对其进行测试。如何让一个包的包私有成员仅对另一个(友好)包可见?

【问题讨论】:

  • 我认为这不可能。最好只有吸气剂。
  • 首先,测试通常与被测类放在同一个包中。第二——不要检查内部状态。确保该类正确实现了其 API,但通常不应直接测试实现细节。
  • @Zarwan,在 .NET 中,我可以用 [InternalsVisibleTo("Tests")] 标记程序集来解决这个问题。我在 Java 中找不到等效功能的障碍,因为它也是可反射的。
  • 您可以使用反射来更改可访问性,但我不建议这样做。
  • 你的问题体现了一个矛盾的术语。

标签: java unit-testing package encapsulation access-specifier


【解决方案1】:

是的,可以做到。有点……

包私有的东西对同一个包中的其他类可见,但不一定是同一个目录

您可以将一个类声明为在同一个包中,但将其放在另一个目录结构(例如您的测试代码)下,甚至放在另一个项目中。

你提到了测试,所以我假设你想在你的测试中“看到”这些东西。只需将您的测试类定义为与您的生产代码在同一个包中(不是同一个目录)。

【讨论】:

  • 我做了一个测试项目,并为它使用了相同的包名,并取得了成功。这是作品!我认为这种方式在概念上是正确的,因为单元测试只是开发工具,它们可以用作包扩展,但不包括在最终产品中。
【解决方案2】:

根据定义,包私有成员对包外的类不可见。这表明您正在尝试做一些您不应该做的事情,即使您正在测试。

您可以使用 getter 或反射来解决它,但我会先看看您是否需要访问这样的成员。如果它是内部状态,则不应对其进行测试。如果不是,那么吸气剂可能是合适的。或者将您的测试放在同一个包中(但可能存储在不同的目录树中)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2012-01-06
    • 2015-08-06
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多