1

我有以下课程,并且我已经测试了方法 1 并模拟了方法 2 和方法 3。我只测试这样的用例: * 如果 method2 调用正常,则 ==> OK * 如果 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 {
  ...
}

}
4

2 回答 2

1

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

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

这确实意味着您可能在您的测试method1和测试之间有一些重复的断言method2,但平衡这一事实是您的测试对于实现的更改将是健壮的。

于 2013-11-05T01:40:33.803 回答
0

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

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

你总是应该尽量让你的测试尽可能简单。

于 2013-11-04T18:38:06.620 回答