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

时间:2016-07-06 07:26:20

标签: java testing junit

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

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

4 个答案:

答案 0 :(得分:2)

在Java中,你唯一能做的就是让你的东西打包保护,如果你想从你的测试代码中使用它们(也就是说:如果你不希望它们被公开) 。

示例:我的课程经常看起来像

class Whatever
  public Whatever() { this(new A(), new B()); };
  Whatever(A a, B b) { ...

允许我使用第二个构造函数进行需要依赖注入的单元测试;并且同时依赖于生产代码应该总是使用公共构造函数的“约定”。

所以,即使我有不希望在我的包之外使用的类......我也会将构造函数公开表示:请使用这个。

这个想法基本上就是你的生产代码和测试代码位于同名的包中。

换句话说:Java没有提供访问来测试代码的好功能。

答案 1 :(得分:2)

在某些java库中有@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()
   }
}

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

答案 2 :(得分:1)

引用similar question

的答案

  

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

     

您应该测试您的公共接口。如果方法那样   调用你的私有方法正如你所期望的那样工作,然后假设   通过扩展,您的私人方法正常工作。“

这相当于此link

中的选项1

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

答案 3 :(得分:1)

当然,必须使方法可见的方法是不完美的,否则这些方法将是私有的,即使它只在类自己的包中。

另一方面,无论如何推荐(并且有很多好处)不依赖于异常,而是依赖于接口。

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