java - 如何在不公开所有内容的情况下测试 Java 中的默认访问级别类?

标签 java testing junit

在 Swift 中,要测试默认访问级别类,可以将 @testable 放在测试类 header 中,使内部访问级别类可以从测试包访问和测试,而无需在类公开。我想知道 Java 是否有办法达到同样的目的?

如何在不公开类中的所有内容的情况下从测试包测试 Java 中的默认访问级别类?

最佳答案

有些java lib中有@VisibleForTesting注解,但一般不会阻止非法访问。即使使包 protected 也不能解决所有问题,因为仍然有一些其他类可以使用测试代码,这可能会导致一些意外行为。我最近偶然发现了一个很好的结构,它允许你展示关于公开一些测试方法的意图

public class A{
   private int someMethodYouWantToTest(){}

   private Testability testability = new Testability();

   class Testability{
      int exposedMethodForTest(){
          someMethodYouWantToTest()  
      }
   }
}

然后在你的测试类中

public class Test{
    private A underTest = new A()

   public void testHiddenMethod(){
      a.testability.exposedMethodForTest()
   }
}

这样您的私有(private)方法就是私有(private)的,只有通过明确说明其用途的专用可测试性内部类才能访问,因此没有人会在测试之外意外调用您的方法。这解决了可能从其他地方调用但实际上是私有(private)的包保护业务方法的问题。

关于java - 如何在不公开所有内容的情况下测试 Java 中的默认访问级别类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38218379/

相关文章:

java - 错误:运行Map减少作业时出现org/jdom/JDOMException

JavaFX 的 WebEngine 卡在 RUNNING 状态

java - 使用dom java解析xml

java - UnsatisfiedLinkError - 无法加载库 - 在资源路径中找不到 native 库

java - Junit Mockito 测试用例给出的方法 X 给出的类型不明确

android - 使用 JUnit 和 JDK 测试 Android 代码

android - 如何确定 TextView 的背景颜色?

java - BeanCreationException : Error creating bean with name 'flywayInitializer'

ios - 运行葫芦测试时如何模拟后端交互

java - 在模拟文件路径时如何编写有效的 JUnit 测试?