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

标签 java unit-testing junit solid-principles

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

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

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

现在在我的测试中,我通过这样做创建一个虚拟模型( validator 是一个辅助类,用于检查它是否为空,这并不重要):

@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) code> 到 .put(0, null) 到正确的插槽。

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

最佳答案

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

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

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

关于java - 用于模拟变化很大的假模型的良好单元测试实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41251002/

相关文章:

java - JBoss/Resteasy 如何在公开 API 之前使用过滤器预填充对象?

Java 代码未使用 'javac' 编译但在 Eclipse 中编译

java - 如何在 Spring 测试中的@Test方法之前只填充一次数据库?

java - Intellij Gradle 项目无法使用 junit 4.11 解析 assertEquals 作为 testCompile dep

java - 使用名称模拟身份验证

java - 没有 proto 文件的 Protobuf

javascript - 如何获得 nock 的响应

c# - 单元测试构造函数注入(inject)

rest - 无法使用golang中的gorilla mux从url读取变量

java - Mockito:模拟一个操作输入数组参数的方法