java - 用一个测试类测试父类(super class)和子类

标签 java junit parameterized

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

因为我是 JUnit(事实上,Java)的新手,而且除了最简单的测试之外什么也没写,所以我想听听更多精通 JUnit 的用户如何处理此类情况。 我一直在 JUnit In Action,第 2 版,曼宁,2010 年 7 月 中复习理论,但我很难理解如何在 super /子场景中使用它。

我没有包含代码也就不足为奇了,因为坦率地说,我目前没有任何代码。我不是要微波代码,但我会很感激一些指示,这样我就可以继续我的快乐之旅,而不是编写一堆样板文件。

最佳答案

假设您有这样的 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());
    }
}

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

关于java - 用一个测试类测试父类(super class)和子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19618407/

相关文章:

java - Java 中的整数操作

java - Tomcat 缓存下载的文件

java - 不使用 XPath 从 webtable 内的元素获取文本(Selenium Web 驱动程序 + Java)

spring - 用于 Spring Boot 应用程序的 JUnit @BeforeClass 非静态工作

c# - 从 C# 代码导出参数化 SSRS 报告

python - (python)使用@parameterized lib 声明驱动程序?

Java - 打印列表<>

java - 如何在 Junit (Java) 中测试集合

java - JUnit 参数化测试显示换行符

java - Hibernate 创建不需要的映射表