突变对象以验证测试中的深克隆



我有一个称为 IDeepClonable的接口,该界面暴露于方法 DoDeepClone

出于绩效原因,每个深克隆都是手工实现的。

我想编写一个测试,该测试能够检查所有在我的组件中实现界面的对象,它确实确实正确克隆了。

验证很容易,我有一个名为DeepEqual的库来检查此。

问题是要确保所有字段都没有默认值!

ef:null for String,0用于int等,等等

此外,用户可能会执行以下操作:

public int MyNumber = 5;

好吧,我可以忘记深克隆,但是测试仍然会b =通过,因为原始和克隆都有5个值。

什么是突变任何任意对象(大部分是价值类型(的一种方法,以确保每个字段都不同?

我也有诸如limepans之类的东西。

天真的解决方案是简单地构建类型的人类维护的默认值列表,但我想知道是否有一种自动化的方法。

基于反思和随机值实现目标的一些高级想法:

  1. 为给定类型创建1个对象
  2. 带有反射API对象的所有成员(属性和字段(的循环。递归处理参考类型的儿童成员
  3. 对于对象图中的每个值类似的成员,请使用随机函数设置其值(每种可能的值类型的单独的随机值生成(。
  4. 执行DodeEpClone创建克隆对象
  5. 为原始和克隆的对象执行深度等式,并主张其平等

至关重要的是,阶段3中的随机功能产生纯粹的随机值。在即bool型的情况下,生成的值可能与默认值相同(因为有2个可能的值(。但是您可以多次执行此算法,以确保至少使用一次唯一值。

最新更新