什么是模拟变化很大的假模型的良好单元测试实践?

What is a good Unit Test Practice for mocking a fake model that changes a lot?

我正在尝试测试此自定义模型,如果某些值为空,则它不是有效模型。我的自定义模型在它自己的 class 中定义为:

public CustomModel(String FirstName, String LastName, String address, String phone)

...依此类推(还有更多字段,但我们现在仅以这些字段为例)。

现在在我的测试中,我通过这样做创建了一个虚拟模型(验证器是一个助手 class 检查它是否为 null 这并不重要):

@Before
public void setUpBefore()
{
    _customTestModel = new CustomModel("First", "Last", "123 Address", "1234567890");
}

然后作为测试示例,我会这样做:

@Test
public void testNotValidModel_NullLastName()
{
    setUpBefore();
    _customTestModel.put(1, null);
    assertFalse(validator.test(null, _customTestModel));
}

我的问题是,如果我确实需要更改构建自定义模型的方式,请说我现在想这样做:

public CustomModel(String LastName, String FirstName, String phone, String address)

我需要回到我的测试并重新做我的 _customTestModel 并且还需要进入我的每个测试并将 .put(1, null) 更改为 .put(0, null)适当的插槽。

我意识到我的测试非常脆弱,每次我想更改 customModel 时都必须进入测试。我应该如何解决这个问题?

类型安全的要点是,如果您更改签名,则需要更改使用该签名的代码。单元测试的全部要点是您从单元测试中调用新编写的代码。因此,如果您更改现有代码,您的客户端必须中断,如果您添加新代码,则必须为其添加单元测试。系统按预期工作。

我能给你的任何解决方案都只是一种规避它的方法。例如,您可以保留旧的构造函数作为遗产。通常我更愿意让我的单元测试保持最新,而不是让它们阻止删除遗留代码。

如果您有 生产 客户在某种意义上抱怨,那么您将有理由保留遗留模型、添加构建器模式或其他一些解决方案。然后,您需要定义逻辑来维护不完整的模型,并添加更多的单元测试覆盖范围以覆盖新旧代码。但这与你所希望的相反。