测试将来的任何班级变化

时间:2019-05-20 19:00:34

标签: java testing junit mockito

因此,我有一个类似的构建器类:

class Person
{

private String age = "";
private String name = "";

public Person withAge(final String age)...
public Person withName(final String name)...

public Person build()...

// Now my question is due to this function
public Person copyWithSomeChange(){
Person person = new Person;
person.
    withAge(this.age+1).
    withName(this.name).
    build();
}
}

因此,上述类具有一个copyWithSomeChange()方法,该方法使用现有的Person对象创建一个新对象。

现在,我要确保是否有人将一个新字段添加到Person类(如SSN),那么他们就不会忘记将该字段也添加到copyWithSomeChange()中。我已经使用反射创建了一个单元测试,并做了下面的一些修改,但这似乎不太正确。

@Test
public void copyWithSomeChange() throws IllegalAccessException, NoSuchFieldException {

        Person person1 ;// some existing object

        Person person2 = person1.copyWithSomeChange();

        for (Field field : person1.getClass().getDeclaredFields()) {
                final Field temp = person2.getClass().getDeclaredField(field.getName());

                field.setAccessible(true);
                temp.setAccessible(true);

                Assert.assertNotEquals("Mismatch in values for field " + field.getName(), field.get(person1), temp.get(person2));

           }
        }
    }

此测试的工作方式是确保更改年龄和姓名的默认值。

我在这里采用了完全错误的方法,我认为这是一件好事,但是如何正确地做呢?

1 个答案:

答案 0 :(得分:2)

  

现在,我要确保是否有人向Person类添加了新字段,例如   SSN,那么他们就不会忘记将该字段添加到   copyWithSomeChange()也是如此。

单元测试通常不旨在根据在被测组件中进行的代码修改来“更新”断言。
虽然可以依靠反射来执行这样的事情。
但是仍然有断言。如果在编写单元测试时不知道该字段存在,因此应该如何在字段上编写特定的断言,因此应在副本中更改该字段的方式?

我认为,就您而言,避免错误编程的最佳方法是使用TDD或类似的方法,该方法首先侧重于测试,然后侧重于实现。
这样,您一定会发现实现中的不足。