为调用同一类方法的方法编写测试



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

是否可以

模拟方法 2 和方法 3 以仅测试方法 1 的功能?我还为 method2 和 method3 添加了单独的测试,因此我知道它们正在完全工作。

class ClassUnderTest {
public void method1() {
  try {
    method2();
  } catch (NotFoundException e) {
    method3()
  }
}
public void method2() throws NotFoundException {
  ...
}
public void method3() throws ServiceException {
  ...
}
}

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

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

这确实意味着在method1测试和method2测试之间可能存在一些重复的断言,但平衡这一点是,您的测试对实现的变化将是鲁棒的。

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

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

始终,您应该尽量保持测试简单。

最新更新