gpt4 book ai didi

java - 对仅更新某些属性的方法进行单元测试

转载 作者:行者123 更新时间:2023-11-30 01:52:59 26 4
gpt4 key购买 nike

我想对一个将 Person 类的属性 active 设置为 True 的方法进行单元测试。

Person 类还有许多其他属性:

public class Person{
private int id;
private Boolean active;
private Boolean adult;
... more properties

... getters and setters
}

测试方法如下所示:

public void updatePersonStatus(int personId){
Person person = getPersonById(personId);
person.setActive(true);

repository.save(person);
}

仅测试使用具有 active true 属性的对象 person 调用方法 save 是否足够(使用 mockito 的示例):

    @Test
public void activateTest() {
ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);
Person testPerson = new Person();
testPerson.setActif(true);

responsableExamenService.updatePersonStatus(1);

verify(theClass, times(1)).save(argument.capture()); //verify that the method save is called one time with a class Person as a parameter
assertTrue(argument.getValue().getActive()); //and that the Object person have a property active to true.
}

或者我还需要测试 Person 的所有其他属性都没有被更改吗?

换句话说,单元测试是否需要验证“方法应该做什么”,或者是否只需要验证方法应该做什么而不验证可能的副作用?这里的副作用示例是除了将 active 设置为 true 之外,开发人员还可以将属性 adult 设置为 true。

PS:该示例是用 Java 编写的,但该问题对几乎所有编程语言都有效

最佳答案

不幸的是,函数不应该做的事情是无限的。不设置所需属性以外的属性只是一种可能性。而且,当涉及到规范时,它们大多只明确说明函数应执行的操作。总是有一个隐含的“仅此而已”,并且很少会明确排除某些选定的行为。

另一方面,当您应用单元测试来检查您编写的代码的行为是否符合您的预期时,问题就变得可以管理:存在一组“可能”的错误,您的测试应该被设计来捕捉那些。例如,您知道您的代码是否执行 I/O,如果没有,则编写单元测试来验证它不执行 I/O 是没有值(value)的。另一方面,如果您有充分的理由相信代码执行的特定操作超出预期可能是一个错误,那么值得进行测试以确保它不会发生。

这同样适用于其他人编写的代码,例如,如果您接管某些代码的维护。无论如何,单元测试是一种白盒测试技术,并且假设您有权访问代码,通常甚至可以更改它(例如,为了提高可测试性)。

关于java - 对仅更新某些属性的方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55422951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com