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

wz3gfoph  于 11个月前  发布在  Java
关注(0)|答案(5)|浏览(104)

在Swift中,要测试默认的访问级别类,可以将@testable放在测试类头中,使内部访问级别类可以从测试包中访问和测试,而无需将类中的所有内容公开。我想知道Java是否有方法访问相同的目的?
如何从测试包中测试Java中的默认访问级别类,而不将类中的所有内容都公开?

sf6xfgos

sf6xfgos1#

在一些java库中有@VisibleForTesting注解,但通常它并不能阻止非法访问。即使使package 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()
   }
}


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

fnatzsnv

fnatzsnv2#

在Java中,如果你想让测试代码使用它们(也就是说:如果你不想让它们是公共的),你唯一能做的就是把它们设置为package protected
例如:我的类经常看起来像

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

字符串
允许我使用第二个构造函数进行需要依赖注入的单元测试;同时依赖于生产代码应该总是使用公共构造函数的“约定”。
所以即使我有一些类不想在我的包外使用..
这个想法基本上是您的生产代码和测试代码驻留在相同命名的包中。
换句话说:Java没有这种只允许测试代码访问的好特性。

jfewjypa

jfewjypa3#

引用一个similar question的答案

你通常不会直接对私有方法进行单元测试。因为它们是私有的,所以把它们看作是实现细节。没有人会调用其中的一个方法,并期望它以特定的方式工作。
相反,你应该测试你的公共接口。如果调用你的私有方法的方法像你期望的那样工作,那么你就可以通过扩展来假设你的私有方法工作正常。”
这相当于此link中的选项1
如果1不符合你的目标,你可以尝试方法2,3和4中提到的链接

guz6ccqo

guz6ccqo4#

当然,让方法对测试可见并不完美,否则这些方法将是私有的,即使它只在类自己的包中。
另一方面,无论如何建议(并且有很多好处)不要依赖于实现,而是依赖于接口。
这意味着:给予客户端一个接口,该接口只声明您希望公开的方法,并使您必须在实现中测试的方法受到保护,并且不将它们包含在接口中。

nkcskrwz

nkcskrwz5#

要测试默认的访问级别类,也就是包私有访问级别,只需在同一个包中,在test根文件夹下创建测试类。示例:
Java根目录:

package com.mycompany.example
class MyProdCodeClass {
  ...
}

字符串
测试根:

package com.mycompany.example
class MyProdCodeClassTest {
  ...
}

相关问题