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

时间:2013-11-04 18:28:10

标签: junit mockito

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

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

class ClassUnderTest {

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

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

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

}

2 个答案:

答案 0 :(得分:1)

你可以使用Mockito spy做你所建议的事情,它允许你存在一些方法而不是其他方法。但是,这通常不是最好的事情。原因是这样的。

对方法的任何形式的测试都应该测试该方法的行为 - 它的输出是什么,它的副作用是什么,以及由于输入的变化是否存在任何特殊行为。如果方法具有正确的行为,那么您的测试实际上不应该关心方法的实现。因此,即使method1调用method2method3,也不要求该类以这种方式实现它。因此,代替method1调用method2的测试,您对method1的测试根本不应提及method2 - 它应该只检查输出和/或侧面method1的影响是它们应该是的。

这确实意味着您在method1的测试和method2的测试之间可能会有一些重复的断言,但是平衡这是因为您的测试对于实现的更改是强大的。< / p>

答案 1 :(得分:0)

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

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

总是你应该尽量让你的测试尽可能容易。