所以,我有一个构建器类:
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()。我已经使用反射创建了一个单元测试并在下面做了一些 hack,但它似乎不太正确。
@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));
}
}
}
此测试的工作方式是确保年龄和姓名的默认值已更改。
我是否采取了完全错误的方法,我认为这是一件好事,但如何以正确的方式做到这一点?
最佳答案
Now I want to ensure if someone adds a new field to Person class, like SSN, then they doesn't forget to add that field to copyWithSomeChange() as well.
单元测试通常不会根据被测组件中的代码修改来“更新”断言。
虽然你可以依靠反射来执行这样的事情。
但仍然有断言会很松散。如果在您编写单元测试时您不知道该字段存在以及该字段应该在副本中更改的方式,您将如何在该字段上编写特定断言?
我认为,在您的情况下,避免错误编程的最佳方法是使用 TDD 或类似方法,首先关注测试,然后关注实现。
通过这种方式,您一定会发现实现中的不足。
关于java - 测试任何 future 的类(class)水平变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56226697/