Как протестировать защищенные методы абстрактного класса, используя JUnit и JMock

У меня такая ситуация - у меня интерфейс (скажем MyInterface) и простая частичная реализация (AbstractMyInterface). Последний добавляет несколько защищенных методов, которые я хотел бы проверить.

В настоящее время я просто пишу вручную фиктивный объект, который расширяется AbstractMyInterface и экспортировать защищенные методы как общедоступные. Есть ли более простой способ сделать это - например, с помощью сценариев JMock+?

3 ответа

Я не вижу проблем с тестированием защищенных методов с помощью JUnit. Пока структура пакета для тестов отражает исходную древовидную структуру, методы, отличные от private, видны для тестов.

Конечно, если реализация для тестирования является абстрактной, вы должны самостоятельно создать нормальный подкласс тестируемого класса (или сделать это с помощью какой-нибудь насмешливой библиотеки, если она лучше подходит для ваших целей). Также в таком случае нет необходимости создавать слой открытых методов только для вызова методов защищенной видимости. Только для частных методов эта стратегия не работает. Но часто необходимость тестировать частные методы в любом случае является признаком проблемы проектирования.

Например: класс для тестирования находится в пакете src/mypackage/AbstractClass.java mypackage;

/** This could as well implement some interface, 
    but that does not change a thing */
public class AbstractClass {
    protected int returnsOne() {
        return 1;
    }
}

И тест, который расположен в tests/mypackage/AbstractClassTest.java

package mypackage;

import org.junit.Test;

import static junit.framework.Assert.assertEquals;

public class AbstractClassTest {
    @Test
    public void returnsOneReturnsOne() {
        AbstractClass instanceToTest = new AbstractClassTestable();
        assertEquals(1, instanceToTest.returnsOne());
    }
}

/** This is needed, because we cannot construct abstract class directly */
class AbstractClassTestable extends AbstractClass {
}

Просто предложение,

Что если мы не протестируем защищенные методы, можем ли мы использовать открытые методы для покрытия этих защищенных методов?

Если нет, то это из-за слишком сложных защищенных методов, рефакторинг для извлечения сложных вещей в новый объект, который предоставляет открытые интерфейсы, оставляя старый объект только один частный объект в некоторых открытых методах.

Тест будет позже на новом объекте.

Этот пост может быть полезным.

Вы можете сделать абстрактный тестовый пример для интерфейса (или абстрактного класса). затем создайте конкретный контрольный пример, который расширяет ваш абстрактный контрольный пример для каждой конкретной реализации вашего интерфейса (или абстрактного класса).

Другие вопросы по тегам