因此,我有一个类似的构建器类:
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));
}
}
}
此测试的工作方式是确保更改年龄和姓名的默认值。
我在这里采用了完全错误的方法,我认为这是一件好事,但是如何正确地做呢?
答案 0 :(得分:2)
现在,我要确保是否有人向Person类添加了新字段,例如 SSN,那么他们就不会忘记将该字段添加到 copyWithSomeChange()也是如此。
单元测试通常不旨在根据在被测组件中进行的代码修改来“更新”断言。
虽然可以依靠反射来执行这样的事情。
但是仍然有断言。如果在编写单元测试时不知道该字段存在,因此应该如何在字段上编写特定的断言,因此应在副本中更改该字段的方式?
我认为,就您而言,避免错误编程的最佳方法是使用TDD或类似的方法,该方法首先侧重于测试,然后侧重于实现。
这样,您一定会发现实现中的不足。