тестирование супер и подклассов с одним тестовым классом

У меня есть два пользовательских класса Date (назовем их DateV1 и DateV2), один из которых является супер, а другой — под, оба реализуют именно одни и те же методы.
Начиная с JUnit 4.x, параметризованные тесты предлагают способ тестирования обоих классов в одном тестовом классе (хотя некоторые люди считают параметрические тесты запутанными и обычно избегают из них).

Поскольку я новичок в JUnit (и, конечно же, в Java) и пишу только самые простые тесты, я хотел бы услышать от более опытных пользователей JUnit, как справляться с подобными ситуациями. Я просматривал теорию в JUnit In Action, 2-е изд., Мэннинг, июль 2010 г., но мне трудно понять, как это будет использоваться в супер-/суб-сценарии.

Неудивительно, что я не включаю код, потому что, честно говоря, в данный момент у меня его нет. Я не прошу микроволновый код, но некоторые указатели будут оценены, чтобы я мог весело провести время и не писать кучу шаблонов.


person Wim Ombelets    schedule 27.10.2013    source источник
comment
Я могу придумать множество неуклюжих способов сделать это, но ничего элегантного   -  person tom    schedule 27.10.2013


Ответы (1)


Предполагая, что у вас есть такие DateV1 и DateV2:

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());
    }
}

Однако есть один важный вопрос: должны ли ваши супер- и подклассы (DateV1 и DateV2) тестироваться одинаково? Предоставляет ли класс DateV2 точно те же функциональные возможности, что и его суперкласс DateV1? Если нет абсолютно никакой разницы в поведении между этими классами, почему они существуют? Если есть разница между ними, то она должна быть устранена вашим тестом.

person Adam Siemion    schedule 27.10.2013
comment
вкратце: DateV1 написано с нуля, используя принцип лучших усилий, DateV2 использует java.util.GregorianCalendar. Количество методов, их сигнатуры и типы возвращаемых значений идентичны. Так что да, я бы сказал, что тесты должны быть идентичными. - person Wim Ombelets; 27.10.2013