java - 测试任何 future 的类(class)水平变化

标签 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()。我已经使用反射创建了一个单元测试并在下面做了一些 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/

相关文章:

Spring MVC 测试 : How do I check if a model attribute does not exist?

java - 括号应该总是放在三元运算符周围吗?

java - Java使用的内存远大于堆大小(或正确大小的Docker内存限制)

java - Android:唯一 ID 生成器和语言环境

javascript - 导航到其中的页面()

Angular 5 测试返回错误

iphone - 在没有 Apple Developer 帐户的情况下在 iPhone 上测试 react-native 应用程序

java - 如何用 Java 编写 JUnit 测试,检查一个特定的打印,该打印依赖于循环中的用户输入

java - 如何将包含 HTML 元素的 Java 字符串解析为 JsonObject?

java - 使用正则表达式断言 RestAssured 响应正文