如何在Java中测试默认访问级别类而不公开所有内容?

如何在Java中测试默认访问级别类而不公开所有内容?,java,testing,junit,Java,Testing,Junit,在Swift中,要测试默认访问级别类,可以将@testable放在测试类标题中,使内部访问级别类可以从测试包访问和测试,而不必公开类中的所有内容。我想知道Java是否有办法达到同样的目的 如何从测试包中测试Java中的默认访问级别类,而不使类中的所有内容都公开?在Java中,如果您希望从测试代码中使用这些内容,则唯一可以做的事情是使它们受到包保护,即:如果您不希望它们公开 我的课经常看起来像 class Whatever public Whatever() { this(new A(), n

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


如何从测试包中测试Java中的默认访问级别类,而不使类中的所有内容都公开?

在Java中,如果您希望从测试代码中使用这些内容,则唯一可以做的事情是使它们受到包保护,即:如果您不希望它们公开

我的课经常看起来像

class Whatever
  public Whatever() { this(new A(), new B()); };
  Whatever(A a, B b) { ...
允许我在需要依赖注入的单元测试中使用第二个构造函数;同时,根据惯例,生产代码应该倾向于始终使用公共构造函数

所以,即使我有我不想在包外使用的类。。。我将构造函数公开表示:请使用此构造函数

基本上,您的生产代码和测试代码驻留在同名的包中


换句话说:Java没有只允许访问测试代码的良好特性。

在Java中,如果您希望从测试代码中使用这些内容,那么您唯一能做的就是对其进行包保护,即:如果您不希望它们公开

我的课经常看起来像

class Whatever
  public Whatever() { this(new A(), new B()); };
  Whatever(A a, B b) { ...
允许我在需要依赖注入的单元测试中使用第二个构造函数;同时,根据惯例,生产代码应该倾向于始终使用公共构造函数

所以,即使我有我不想在包外使用的类。。。我将构造函数公开表示:请使用此构造函数

基本上,您的生产代码和测试代码驻留在同名的包中

换句话说:Java没有这种只允许访问测试代码的好特性。

引用一个问题的答案

您通常不会直接对私有方法进行单元测试。既然是 私有的,认为它们是实现细节。没有人会去 打电话给他们中的一个,并期望它以特定的方式工作

您应该改为测试您的公共接口。如果采用的方法 调用您的私有方法,然后假设它们按照您的预期工作 通过扩展,您的私有方法工作正常

这相当于本文件中的选项1

如果1不符合您的目标,您可以尝试链接中提到的方法2、3和4

您通常不会直接对私有方法进行单元测试。既然是 私有的,认为它们是实现细节。没有人会去 打电话给他们中的一个,并期望它以特定的方式工作

您应该改为测试您的公共接口。如果采用的方法 调用您的私有方法,然后假设它们按照您的预期工作 通过扩展,您的私有方法工作正常

这相当于本文件中的选项1


如果1不符合您的目标,您可以尝试链接中提到的方法2、3和4

在一些java LIB中有@VisibleForTesting注释,但通常它不能防止非法访问。即使保护包也不能解决所有问题,因为还有一些其他类可以使用测试代码,这可能导致一些意外行为。我最近偶然发现了一个很好的构造,它允许您展示公开一些测试方法的意图

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()
   }
}

通过这种方式,您的私有方法是私有的,并且只有通过明确说明其用途的专用可测试性内部类才能访问,所以没有人会在测试之外意外调用您的方法。这解决了包保护的businness方法的问题,这些方法可以从其他地方调用,但实际上是私有的。

在一些java LIB中有@VisibleForTesting注释,但通常不能防止非法访问。即使保护包也不能解决所有问题,因为还有一些其他类可以使用测试代码,这可能导致一些意外行为。我最近偶然发现了一个很好的构造,它允许您展示公开一些测试方法的意图

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()
   }
}

通过这种方式,您的私有方法是私有的,并且只有通过明确说明其用途的专用可测试性内部类才能访问,所以没有人会在测试之外意外调用您的方法。这就解决了包保护的businness方法的问题,这些方法可以从其他地方调用,但实际上是私有的。

确保必须使方法在测试中可见,否则这些方法将是私有的,这并不完美,即使它只在类自己的包中

另一方面,它无论如何都是值得推荐的 它有很多好处,不依赖于实现,而是依赖于接口


这意味着:为客户机提供一个接口,该接口只声明您要公开的方法,并使您必须在实现中测试的方法受到保护,而不将它们包括在接口中。

确保必须使方法对测试可见(否则将是私有的)这一点并不完美,即使它只在类自己的包中

另一方面,它还是被推荐的,它有很多好处,不依赖于实现,而是依赖于接口

这意味着:为客户机提供一个接口,该接口只声明要公开的方法,并使您必须在实现中测试的方法受到保护,而不将它们包含在接口中