Junit 为从同一类调用方法的方法编写测试
我有下面的课程,我测试了method1,模拟了method2和method3。我只测试以下情况: *如果method2调用正常,则==>OK *如果method2抛出NotFoundException,method3返回OK==>OK *如果method2抛出NotFoundException,method3抛出ServiceException==>ServiceException确实被抛出 为了测试method1的功能,可以模拟method2和method3方法吗?我还为method2和method3添加了单独的测试,所以我知道它们完全可以工作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
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
测试之间可能存在一些重复的断言,但要平衡这一事实,您的测试将对实现的更改具有鲁棒性。您可以使用Mockitospy来执行您的建议,它允许您存根某些方法,但不允许存根其他方法。然而,这通常不是最好的做法。原因是这样的
任何一种方法的测试都应该测试该方法的行为——它的输出是什么,它的副作用是什么,以及是否由于输入的变化而有任何特殊行为。您的测试实际上不应该关心方法的实现是什么,只要它具有正确的行为。因此,即使method1
调用method2
和method3
,类也不要求以这种方式实现。因此,与断言method1
调用method2
的测试不同,您对method1
的测试根本不应该提及method2
——它应该只检查method1
的输出和/或副作用是否与预期相符
这确实意味着您的method1
测试和method2
测试之间可能存在一些重复的断言,但平衡这一事实是,您的测试将对实现的更改具有鲁棒性。应谨慎使用部分模拟。这可能会导致糟糕的设计。通常,您应该测试行为,而不是实现。您可以在这里找到更多解释:应该谨慎使用部分模拟。这可能会导致糟糕的设计。通常,您应该测试行为,而不是实现。您可以在此处找到更多解释: