在编写单元测试时,有时会遇到如下情况:createOrUpdate
方法根据条件调用其他方法,在这个场景中,我有两种选择:
**1.**我可以为所有3种方法编写一个测试,在第一个测试方法(createOrUpdate
)中,只需验证是否调用了其他方法(create
或update
)。在其他测试方法中,我按照通常的编写方式编写测试。
**2.**我可以只为第一个方法(createOrUpdate
)编写多个测试,并根据条件测试其他2个方法。然后我认为我可以测试所有这3个方法。
由于我是单元测试的新手,我只想澄清哪种方法是单元测试的正确或合适的方法。任何帮助都将不胜感激。
国家/地区服务:
public CountryDTO createOrUpdate(UUID uuid) {
if (countryRepository.existsByUuid())
return update(uuid);
else
return create(uuid);
}
public CountryDTO create(UUID uuid) {
// ...
}
public CountryDTO update(UUID uuid) {
// ...
}
2条答案
按热度按时间kuhbmx9i1#
这实际上取决于函数的实现。
如果
#create
和#update
函数仅从#createOrUpdate
函数调用,则第二种方法(仅编写#createOrUpdate
函数的测试)更有意义。如果
#create
和#update
函数也可以被外部类/函数访问,那么第一种方法(为单个函数编写测试)更有意义。因为你可以直接向函数发送不同类型的数据,允许你正确地覆盖所有的地面。例如:您可以测试当UUID
不存在而有人正在调用您的#update
函数时会发生什么。总的来说,您可以使用这两种方法,直到您正确地涵盖了所有情况。
6rqinv9w2#
歉意道长回答:
首先,您需要了解我们为什么要编写Junit测试用例。
主要原因是为了确保我们的公共方法对于该方法的用户的所有可能的输入组合都能按预期运行,因此每个公共方法都需要有自己的测试用例来Assert该方法的行为,一个方法的测试用例不应知道正在使用它的任何其他方法是否也有测试用例
让我们了解原因和方法:
假设你采用第一种方法-
让我们从方法createOrUpdate的用户的Angular 来考虑
如果明天有人对方法2和方法3进行了任何更改,他们将仅更新这两种方法的测试用例,而方法1的测试用例将无法识别方法1的行为更改,这对方法1的用户来说是一个bug
因此,为了避免将来出现此类错误**,您需要编写测试用例来Assert方法的行为,而不仅仅是方法是否调用其他方法**
现在假设你采用第二种方法-
让我们从创建和更新方法的用户的Angular 来考虑-
如果在第一个方法当前代码中(createOrUpdate),您需要一些额外的行为,然后继续更新内部调用的方法(2,3)而不是在方法1中编写新代码??..您将满足方法1的未来需求,并仅更新方法1的测试用例,但由于方法2没有单独的测试用例,方法3你不会知道你是否打破了方法2的需要,方法3的用户!!
这可能会给方法2和方法3的用户造成bug!!
因此,为了避免将来出现此类错误**,如果您发现多个测试用例中存在一些测试逻辑冗余,则需要编写测试用例来分别Assert每个方法的行为**