【问题标题】:writing tests for method that calls methods from same class为从同一类调用方法的方法编写测试
【发布时间】:2013-11-04 18:28:10
【问题描述】:

我有以下课程,并且我已经测试了方法 1 并模拟了方法 2 和方法 3。我只测试用例,例如: * 如果方法 2 调用正常,则 ==> 正常 * 如果 method2 抛出 NotFoundException 并且 method3 返回 OK ==> OK * 如果 method2 抛出 NotFoundException 并且 method3 抛出 ServiceException ==> ServiceException 确实被抛出

是否可以模拟方法 method2 和 method3 以仅测试 method1 的功能?我还为方法 2 和方法 3 添加了单独的测试,所以我知道它们可以正常工作。

class ClassUnderTest {

public void method1() {
  try {
    method2();
  } catch (NotFoundException e) {
    method3()
  }
}

public void method2() throws NotFoundException {
  ...
}

public void method3() throws ServiceException {
  ...
}

}

【问题讨论】:

标签: junit mockito


【解决方案1】:

您可以按照您的建议做,使用 Mockito spy,它允许您存根某些方法,但不能存根其他方法。然而,这通常不是最好的做法。原因是这样的。

任何类型的方法测试都应该测试该方法的行为——它的输出是什么,它的副作用是什么,以及由于输入的变化是否有任何特殊行为。你的测试真的不应该关心方法的实现是什么,只要它有正确的行为。因此,即使method1 调用method2method3,它也不是以这种方式实现的类的要求。因此,不是断言method1 调用method2 的测试,您对method1 的测试根本不应该提及method2 - 它应该只检查method1 的输出和/或副作用是什么应该是。

这确实意味着您可能在 method1 的测试和 method2 的测试之间有一些重复的断言,但要平衡这一点,您的测试将对实现的变化保持稳健。

【讨论】:

    【解决方案2】:

    这取决于您希望为测试提供的粒度。

    约定可以只是其他类的模拟方法,以使测试用例更容易编写,但在某些情况下,您可能必须为同一类的方法编写模拟,例如,如果您想模拟方法2中的错误可以模拟它。

    您始终应该尽量让您的测试尽可能简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      相关资源
      最近更新 更多