测试任何未来的类级别更改

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (11)

所以,我有一个类似于的构建器类:

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));

           }
        }
    }

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

我在这里采取了一种完全错误的方法,我认为这是一件好事,但如何以正确的方式做到这一点?

提问于
用户回答回答于

现在我想确保有人向Person类添加一个新字段,比如SSN,那么他们也不会忘记将该字段添加到copyWithSomeChange()中。

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

我认为在您的情况下,避免错误编程的最佳方法是使用TDD或类似的方法,首先关注测试然后实现。 通过这种方式,您必然会发现实现中的不足。

扫码关注云+社区

领取腾讯云代金券