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

Junit 为从同一类调用方法的方法编写测试,junit,mockito,Junit,Mockito,我有下面的课程,我测试了method1,模拟了method2和method3。我只测试以下情况: *如果method2调用正常,则==>OK *如果method2抛出NotFoundException,method3返回OK==>OK *如果method2抛出NotFoundException,method3抛出ServiceException==>ServiceException确实被抛出 为了测试method1的功能,可以模拟method2和method3方法吗?我还为method2和met

我有下面的课程,我测试了method1,模拟了method2和method3。我只测试以下情况: *如果method2调用正常,则==>OK *如果method2抛出NotFoundException,method3返回OK==>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 {
  ...
}

}

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

约定可以是其他clasee的mock方法,以便更容易编写测试用例,但在某些情况下,可能必须为同一类上的方法编写mock,例如,如果要模拟method2中的错误,可以对其进行模拟


您应该始终尽可能使测试简单。

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

约定可以是其他clasee的mock方法,以便更容易编写测试用例,但在某些情况下,可能必须为同一类上的方法编写mock,例如,如果要模拟method2中的错误,可以对其进行模拟


您应该始终尽量使测试简单。

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

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


这确实意味着您的
method1
测试和
method2
测试之间可能存在一些重复的断言,但要平衡这一事实,您的测试将对实现的更改具有鲁棒性。

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

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


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

应谨慎使用部分模拟。这可能会导致糟糕的设计。通常,您应该测试行为,而不是实现。您可以在这里找到更多解释:应该谨慎使用部分模拟。这可能会导致糟糕的设计。通常,您应该测试行为,而不是实现。您可以在此处找到更多解释: