使用一个测试类测试超类和子类

时间:2013-10-27 13:09:29

标签: java junit parameterized

我有两个自定义日期(我们称之为DateV1DateV2),一个是超级,另一个是子,两者都采用完全相同的方法 从JUnit 4.x开始,参数化测试似乎提供了在单个测试类中测试两个类的方法(尽管有些人似乎发现参数化测试令人困惑并且通常避开它们)。

因为我是JUnit的新手(事实上,Java)并且除了最简单的测试之外什么都没写,我想听听更为精通的JUnit用户如何应对这些情况。 我一直在 JUnit In Action,第2版,Manning,2010年7月中讨论这个理论,但我很难看到如何在超级/子场景中使用它。

我不会包含代码,因为坦率地说我现在没有代码。我不是要求微波代码,但有些指针会受到赞赏,所以我可以按照我的快乐方式而不是写一堆样板。

1 个答案:

答案 0 :(得分: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相同的功能?如果这些类之间的行为绝对没有差异,为什么要这两个?如果两者之间存在差异,则应通过测试解决。