Java-如何单元测试TimSort和;“违反一般合同”;问题
这个问题与 以及其他几个类似的“违反总合同”问题。我的问题与Ceekay在页面底部关于“如何测试TimSort实现”的回答特别相关。在我的例子中,我已经修复了将我带到这里的应用程序错误,这是由于对称性冲突造成的,但是我在创建单元测试以暴露该冲突时遇到了困难(如果修复被注释掉或将来未修复)Java-如何单元测试TimSort和;“违反一般合同”;问题,java,unit-testing,timsort,Java,Unit Testing,Timsort,这个问题与 以及其他几个类似的“违反总合同”问题。我的问题与Ceekay在页面底部关于“如何测试TimSort实现”的回答特别相关。在我的例子中,我已经修复了将我带到这里的应用程序错误,这是由于对称性冲突造成的,但是我在创建单元测试以暴露该冲突时遇到了困难(如果修复被注释掉或将来未修复) 公共类TickNumber实现可比较{ 保护串带; 保护串轨道; } 公共类GisTickNumber扩展了TickNumber实现了Compariable{ 私有字符串后缀; } 我省略了所有的实现细节,但
公共类TickNumber实现可比较{
保护串带;
保护串轨道;
}
公共类GisTickNumber扩展了TickNumber实现了Compariable{
私有字符串后缀;
}
我省略了所有的实现细节,但基本上,勾号是一个4位数的数字,其中前两位数是区域,后两位数是轨道。数字可以在区域和/或轨迹字段中具有alpha字符,并且可以选择具有一个或两个字符的alpha后缀。有效记号是范围[0000,9999]
中的所有整数(即使表示为字符串)。所有有效的勾号都是有效的Gis勾号,但有效的Gis勾号也可以类似于A912、R123、0123G、A346*
我的对称性违规是在GisTickcompareTo
中,我考虑了可能的后缀,但在普通的TickcompareTo
中,我没有考虑它。因此,如果“this”是0000
Tick,“that”是0000*
Gis Tick,0000.compareTo(0000*)
将返回0。而如果“this”是一个0000*
Gis勾号,“that”是一个0000
勾号,0000*.compareTo(0000)
将返回1。明显的对称性破坏(一旦护罩向后拉)
Ceekay在回答相关问题时表示
Collections.sort(testList)
的调用由于“一般(对称)契约违反”而失败,测试对象列表还需要满足哪些其他特性
- 是的,在我运行单元测试之前,我注释掉了我预期会失败的修复
- 已解决:
我最终调试到一个断点,在那里我可以查看列表中对象的
toString()
表示,并对其进行排序,然后能够从其余数据中提取TickNumber信息,并最终在单元测试中使用提取的数据。最后,我返回并删除了列表项,直到我创建了一个似乎满足触发对称相关“一般合同违规”的“最低要求”的列表
我不知道如何将我的具体解决方案概括为一个列表必须满足的一般特征,以触发TimsSort和这种“违反一般合同”。但这是
- 列表必须包含64个元素(49+1+12+1+1)
- 列表必须包含50次运行,其中50个元素中的49个元素的比较结果为0(即比较匹配)
- 在“匹配运行”的前半部分中,必须有1个元素排序在运行中的所有其他元素之前(比较运行中的所有其他元素时匹配),并且该单个奇数元素也必须与其他运行末尾的元素“对称性不匹配”
- 该列表必须包含至少两次其他三个或更多元素的运行(我的测试列表运行8次,然后运行4次)
- “对称性不匹配”的另一半必须是第4次运行(第二次运行)中的最后一项
- 列表必须在(end-1)位置包含一个元素,该元素排序到已排序列表的开头
public class TickNumber implements Comparable<TickNumber> {
protected String zone;
protected String track;
}
public class GisTickNumber extends TickNumber implements Comparable<TickNumber> {
private String suffix;
}