单元测试:允许误报或带来重复

Unit testing: allow for false-positive or bring duplication

我正在测试一个 class,它(除了与其他人交互之外)创建一个对象,该对象的字段由调用者传递的常量和值组成:

private String createService(Long organizationId, String prototypeId,
    MedicalService medicalService)
{
    ServiceType service = new ServiceType();

    service.setClinic(organizationId.toString());
    service.setType("0");
    service.setPrototype(prototypeId);
    service.setCode(medicalService.getCode());
    service.setName(medicalService.getName());
    service.setIndependent(true);
    service.setRepeated(false);

    return remoteWS.createService(service);
}

我应该测试每个字段是否设置正确吗?

我怀疑的原因是它会引入重复并降低可读性。特别是我倾向于做反射断言。

这只能检测到一些 "stupid" 打字错误,例如如果两者都是 String.

类型,则将 code 写入 name 字段

这种重复合理吗?

解决此问题的一种方法:如果您有 "data" 以某种方式属于 "together",那么该数据值得 拥有 class .

对于这种情况,您将使用 scala 所称的 value class for scala, or what kotlin provides as data class。换句话说:一个只存在于环绕 "set" 个值的容器。

那里的核心方面:例如,您为 equals() 方法提供了合理的实现(考虑 Java 术语时)。换句话说:您启用 dataObjectA.equals(dataObjectB) 之类的比较,后者又会比较 class.

all 字段

然后您通过在单元测试中创建该数据的此类实例 class 来利用它,并携带所有预期值。

这是否值得努力的问题不是别人可以告诉你的。你必须评估 A) 在那个角落出错的可能性 B) 这种错误的成本。

从 TDD 的角度来看,您 甚至会 测试这样的细节。

个人想法:有时候还是要务实一点。仅 "records" 生产代码正在执行的单元测试在我看来并没有太大帮助。尽管如此,有时除了这样写下来别无他法。从这个意义上说:我会建议测试这些细节,但是我会退一步设计一个解决方案,使编写相应的测试尽可能简单直接。

换句话说:我会测试这些东西,但要确保我可以用最少的努力做到。