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