3

最初,我写了一个类(让我们称之为RangeSet),它在一个ArrayList区间(我定义为两个 Long 值的区间类)上运行。该列表是间隔的集合,有一种void add(Range range)方法可以检查列表中已有的间隔是否存在重叠、覆盖、包含或邻接。关键是要保存非重叠区间的列表。

我为该类设计并编写了大量测试,检查了可能发生的各种情况。这就是我所说的很多代码。

现在事实证明(无论出于何种原因)我不得不将该类拆分为两个单独的类 -RangeSet将是一个具有几个有用方法并从中继承的抽象类 - ArrayRangeSet(在 中保存间隔集合ArrayList)和TreeRangeSet(保存集合a ) 中的区间TreeSet。方法的实现add(Range range)在这两者之间有很大不同。

我应该如何继承测试以避免定义测试数据的冗余?

示例测试如下所示:

@Test
void testCase4(){
    RangeSet set = new RangeSet();
    Range r1 = new Range(4, 5);
    Range r2 = new Range(13, 15);
    Range r3 = new Range(19, 22);
    set.add(r1);
    set.add(r2);
    set.add(r3);

    Range testRange = new Range(11,100);
    set.add(testRange);

    assertEquals(2,set.iterator().size());
    assertEquals(new Range(4,5),set.iterator().getAt(0));
    assertEquals(new Range(11,100),set.iterator().getAt(1));
}

我不知道我是否清楚:有很多测试数据定义并且这两个类的测试看起来相同。我该如何解决?

编辑:有没有办法将这些断言语句传递给继承的测试类?毕竟,这些add方法应该实现相同的目标,尽管通过不同的操作。

4

3 回答 3

1

您可以使用夹具方法,例如JUnit@Before。或者您可以将其保存在单独的夹具类中。或者,如果合适的话,您可能希望将其保存在属性文件中。我的意思是有多种选择。

这种固定装置对我来说听起来不像是父母。我的意思是夹具和测试类之间没有is a关系。顺便说一句,有基类来处理两个测试类之间的共性是没有害处的。如果您决定使用基类,您可以在那里有一个方法setup,或者说/@Before,方法,它在一个地方准备数据。

于 2012-08-30T10:26:26.320 回答
0

将共享的测试数据放入一个不可变且恒定的类中,例如RangeSetTestData保存测试运行所需的所有内容。RangeSet针对、TreeRangeSet和实施三个测试ArrayRangeSet,这些测试基于恒定的测试数据来测试功能。

编辑:这样你就不必处理任何属性文件/测试资源的序列化和反序列化,并且恒定的测试数据类可以很好地维护。

于 2012-08-30T10:28:44.320 回答
0

我会为 编写一个测试类RangeSet,它提供测试数据并让测试ArrayRangeSetTreeRangeSet继承它。如果您提供一种机制来创建基础测试的实例ArrayRangeSetTreeRangeSet在基础测试中创建实例(例如,抽象的“工厂”方法),您可以将在两个类中应该具有相同行为的所有方法的测试放入基础测试中。测试类ArrayRangeSetTreeRangeSet包含“特定”方法的测试。

于 2012-08-30T11:05:51.627 回答