3

我有两个自定义 Date(我们称它们为DateV1and DateV2),一个是 super ,另一个是 sub,两者都实现完全相同的方法。
从 JUnit 4.x 开始,参数化测试似乎提供了一种在单个测试类中测试两个类的方法(尽管有些人似乎发现参数化测试令人困惑并且通常避开它们)。

因为我是新手JUnit(而且确实是Java),并且只编写了最简单的测试,所以我想听听更熟练的JUnit用户如何处理此类情况。我一直在JUnit In Action,第 2 版,Manning,2010 年 7 月中回顾了该理论,但我很难看到如何在超级/子场景中使用它。

我不包括代码并不奇怪,因为坦率地说,我目前没有。我不是要微波代码,但会很感激一些指针,这样我就可以在我的快乐路上而不是写一堆样板。

4

1 回答 1

1

假设你有这样的DateV1DateV2

public class DateV1 {

    protected final Date date;

    public DateV1(Date date) { 
        this.date = date;
    }

    public int getYear() {
        return 1900 + date.getYear();
    }
}

public class DateV2 extends DateV1 {

    private Calendar cal;

    public DateV2(Date date) {
        super(date);
        cal = Calendar.getInstance();
        cal.setTime(date);      
    }

    public int getYear() {
        return cal.get(Calendar.YEAR);
    }
}

测试可能如下所示:

@RunWith(value = Parameterized.class)
public class DateTest {

    private DateV1 date;

    public DateTest(DateV1 date) {
        this.date = date;
    }

    @Parameters
    public static Collection<Object[]> data() {
        final Date currDate = new Date();
        Object[][] data = new Object[][] { { new DateV1(currDate) }, { new DateV2(currDate) } };
        return Arrays.asList(data);
    }

    @Test
    public void getYearShouldReturn2013() {
        Assert.assertEquals(2013, date.getYear());
    }
}

但是,有一个重要的问题:您的超类和子类 (DateV1DateV2) 是否应该以完全相同的方式进行测试?该类是否DateV2提供与其超类完全相同的功能DateV1?如果这些类之间的行为绝对没有区别,为什么会有两者?如果两者之间存在差异,则应通过您的测试来解决。

于 2013-10-27T13:28:44.763 回答