Unit测试调用同一类中其他方法的方法的策略应该是什么?

时间:2015-11-04 10:23:27

标签: unit-testing testng mockito spock powermockito

我正在为一个类编写单元测试,该类具有调用同一类的其他方法的方法。这导致许多场景需要测试。

我认为我可以间谍()方法调用的行为,这样我只测试测试中的方法,而不是打扰其他方法行为。我将通过针对每种方法的单独测试来覆盖它们。

class MyClass{

  public void myMethodToBeTested(){
     aPrivateMethod();
     aPublicMethod();
  }

  private void aPrivateMethod(){
   // doing something
   // Has some if else scenarios
  }

  public void aPublicMethod(){
   // doing something
   // Has some if else scenarios
  }
}

对这个班级进行单元测试的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

您应该通过调用类的外部接口(即公共方法)进行测试。

如果这些方法在同一个类中调用私有方法,那么那些私有方法也需要完全覆盖 - 否则它们将如何被测试?

对于正在测试的课堂外的资源或课程的调用,存根或间谍才有意义。

您正在尝试测试整个课程,而不仅仅是单个方法。

答案 1 :(得分:0)

在我看来,aPrivateMethod可以作为公共单独的类进入,并且aPublicMethod的主体也可以是该类中的不同方法。

在重构之后,您可以注入新类并在相应的位置调用这些方法。

在测试方面,您可以模拟/存根这些方法并测试myMethodToBeTested()。

答案 2 :(得分:0)

首先,我将私有方法更改为默认/包级别。这样,占用相同包的单元测试可以访问它,但是在该包之外的其他方法不能接触它。与私人范围不完全相同,但大部分时间都足够接近。

然后,在MyClass上设置一个Spy()。

如果您对该术语不清楚:

  • 类上的Mock()将始终返回null或0以进行任何方法调用
  • 类上的Stub()允许您定义该类中的某些方法应该执行的操作,但是您未明确指定的任何内容始终返回null或0
  • 使用Spy()可以创建一个类的对象,所有方法都在适当的位置除了你可以覆盖其中的一些方法

因此,创建一个Spy(MyClass),指定aPrivateMethod()和aPublicMethod()应​​该返回以进行测试,然后调用myMethodToBeTested()并查看返回的内容。在您的示例中,该方法为void,因此它不返回任何内容。但你可以随时:

  1. 在Spy()
  2. 之外定义一个变量
  3. 让aPublicMethod()根据输入或内部状态设置/修改变量(你的Spy()中的覆盖方法可以带参数)
  4. 调用myMethodToBeTested()
  5. 检查该变量的内容
相关问题