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

标签 java unit-testing

我想对一个将 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/

相关文章:

unit-testing - 将参数传递给 tearDown 方法

java - 嵌套对象空字段的 Spring 表单绑定(bind)问题

java - 在 groovy 中使用 HTML 格式的 JIRA Rest API 创建发行说明

java - 将大量参数传递给 Java 类的最佳技术是什么?

Java Swing Timer 第一次实例崩溃

java - Android/Java 单元测试 - 如何在 java.lang.reflect.Method 中使用参数?

java - MacOS 上的 NetBeans 12.1 安装错误

java - 如何在 Junit 测试中覆盖 catch block ?

c# - 模拟对象不具有 Intellisense 中显示的所有属性 - 在一个项目中但在另一个项目中具有它们

c++ - 重构单例/全局以使用依赖注入(inject)进行单元测试