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

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

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

Ответы [ 3 ]

7 голосов
/ 04 декабря 2011

Не вижу проблем с тестированием защищенных методов с помощью 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 {
}
3 голосов
/ 05 декабря 2011

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

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

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

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

Это сообщение в блоге может быть полезным.

0 голосов
/ 05 декабря 2011

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

...