I cannot see any problem with testing protected methods with JUnit. As long as package structure for tests mirrors source tree structure, methods other than private are visible for tests.
Of course if implementation to test is abstract, you have to create normal subclass of class under test by yourself (or do it via some mocking library if fits better for your purposes). Also in such a case, no need to create layer of public methods for just for calling protected visibility methods. Only for private methods this strategy does not work. But often need to test private methods is sign of design problem anyway.
For example:
Class to test located to src/mypackage/AbstractClass.java
package mypackage;
/** This could as well implement some interface,
but that does not change a thing */
public abstract class AbstractClass {
protected int returnsOne() {
return 1;
}
}
And test which is located to 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 {
}