此问题与“比较方法违反其总合同!”有关。- TimSort 和 GridLayout 以及其他几个类似的“一般合同违规”问题。我的问题与页面底部关于“如何测试 TimSort 实现”的 Ceekay 的回答特别相关。在我的情况下,我已经修复了由于对称违反而导致我出现在这里的应用程序错误,但是我无法创建一个单元测试来公开该违反(如果修复被注释掉或将来未修复)。
public class TickNumber implements Comparable<TickNumber> {
protected String zone;
protected String track;
}
public class GisTickNumber extends TickNumber implements Comparable<TickNumber> {
private String suffix;
}
我省略了所有的实现细节,但基本上一个 Tick 数字是一个 4 位数字,其中前两位数字是区域,后两位数字是轨道。GisTickNumbers 可以在区域和/或跟踪字段中包含字母字符,并且它们可以选择具有一个或两个字符的字母后缀。有效刻度是范围内的所有整数[0000, 9999]
(即使表示为字符串)。所有有效的 Tick 数字都是有效的 Gis Tick 数字,但有效的 Gis Ticks 也可能看起来像A912, R123, 0123G, A346*
。
我的对称违规是在 GisTick 中compareTo
,我考虑了可能的后缀,但在普通的 Tick 中compareTo
我没有考虑它。因此,如果 'this' 是0000
Tick 并且 'that' 是0000*
Gis Tick,0000.compareTo(0000*)
将返回 0。而如果 'this' 是0000*
Gis Tick 而 'that' 是0000
Tick,0000*.compareTo(0000)
将返回 1。 明显的对称性违反(一旦护罩被拉回)
根据 Ceekay 在对链接问题的回答中,
- 创建一个包含 32 个或更多对象的列表。
- 在该列表中,需要 [be] 两次或多次运行。
- 每次运行必须包含 3 个或更多对象。
一旦满足这 [三个] 标准,您就可以开始测试此故障。
我相信我已经为我的单元测试设置了这样一个 TickNumber(和 GisTickNumber)对象列表,但我似乎无法让测试失败。即使该列表有超过 100 个对象,也有两次以上的运行,并且每次运行包含大约 10 个对象。所以,我的问题是,被测对象列表需要满足哪些其他特征才能使调用Collections.sort(testList)
因“一般(对称)违反合同”而失败?
- 是的,我在运行我预计会失败的单元测试之前注释掉了修复。