小编gen*_*ons的帖子

Java-如何对TimSort和“违反常规合同”进行单元测试

此问题与“比较方法违反其一般合同!”有关。-TimSort和GridLayout 以及其他一些类似的“违反通用合同”问题。我的问题特别与Ceekay在页面底部有关“如何测试TimSort实现的答案”有关。就我而言,我已修复了由于对称性违规而导致我出现此问题的应用程序错误,但是我无法创建一个单元测试来暴露该违规(如果将来对修补程序进行注释或未修正)。

public class TickNumber implements Comparable<TickNumber> {
    protected String zone;
    protected String track;
}
public class GisTickNumber extends TickNumber implements Comparable<TickNumber> {
    private String suffix;
}
Run Code Online (Sandbox Code Playgroud)

我省略了所有实现细节,但是基本上,刻度号是4位数字,其中前两位是区域,后两位是磁道。GisTickNumbers在“区域”或“跟踪”字段中可以包含字母字符,并且可以选择包含一个或两个字符的字母后缀。有效刻度是该范围内的所有整数[0000, 9999](即使表示为字符串)。所有有效的刻度线编号都是有效的Gis刻度线编号,但有效的Gis刻度线也可能类似于A912, R123, 0123G, A346*

我的对称性违反是在GisTick中compareTo,我考虑了可能的后缀,但在普通Tick中,compareTo我没有考虑它。因此,如果“ this”是一个0000Tick,而“ that”是一个0000*Gis Tick,0000.compareTo(0000*)则将返回0。而如果“ this”是一个0000*Gis Tick,并且“ that”是一个0000Tick,0000*.compareTo(0000)则将返回1。护罩拉回)

根据Ceekay在对链接问题的回答中,

  1. 创建包含32个或更多对象的列表。
  2. 在该列表中,需要[是]两个或多个运行。
  3. 每次运行必须包含3个或更多对象。

满足这三个条件后,就可以开始测试此失败了。

我相信我已经为单元测试设置了这样的TickNumber(和GisTickNumber)对象列表,但我似乎无法使测试失败。即使列表中有100个以上的对象,也有两个以上的运行,每个运行包含约10个对象。因此,我的问题是,Collections.sort(testList)由于“一般(对称)合同违约”而导致调用失败,被测对象列表还需要满足哪些其他特征?

  • 是的,在运行预期会失败的单元测试之前,我已注释掉该修复程序。

java unit-testing timsort

5
推荐指数
1
解决办法
301
查看次数

标签 统计

java ×1

timsort ×1

unit-testing ×1