Вот мой исходный класс -
public class ClassToTest extends AbstractSuperClass<Integer> {
private static final ClassToTest INSTANCE = new ClassToTest(); // (line 1) need to mock this variable
static ClassToTest get() {
return INSTANCE;
}
private ClassToTest() {
super(Integer.class);// (line 2)
}
}
Вот моя попытка проверить это
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassToTest.class)
public class TestClass {
private ClassToTest testClass;
@Before
public void setUp() {
// each of the below attempts fails at line 1 because of the call to line 2 (annotated above).
// Attempt A.
testClass = WhiteBox.newInstance(ClassToTest.class);
//Attempt B.
testClass = mock(ClassToTest.class);
WhiteBox.setInternalState(ClassToTest.class, "INSTANCE", testClass);
}
@Test
public void dummy() {
// irrelevant
}
}
Я пытаюсь эффективно издеваться над ClassToTest.INSTANCE
и вызывать его частный конструктор. Как я мог это сделать?
РЕДАКТИРОВАТЬ: Фрагмент/конструктор вызывается из AbstractSuperClass
.
public abstract class AbstractSuperClass<V extends Serializable> {
private final CacheClient<V> cache;
private final int seconds;
public AbstractSuperClass(Class<V> valueType) {
cache = new ClientFactory(Config.getAppConfig(), StatisticSet.getGlobalStatistics()).newClient(getCacheType(), valueType);
seconds = Config.getAppConfig().get(getCacheType().getSectionEnum()).getSeconds();
}
P.S. Я стараюсь держаться подальше от внутренностей AbstractSuperClass
и изначально надеялся просто издеваться над вызовом. Я также открыт для любых идей по рефакторингу ClassToTest
, чтобы избежать этого.
ClassToTest.INSTANCE
работает, если вы добавитеtestClass.doSomething(); verify(testClass).doSomething();
к методуdummy
, тогда тесты пройдут, поэтому я не вижу, в чем на самом деле проблема (я использовал попытку B). Не могли бы вы добавить дополнительную информацию о том, в чем проблема? - person Gergely Toth   schedule 10.09.2016AbstractSuperClass
из частного конструктора, я отредактировал вопрос и добавил дополнительные сведения о классе. - person seeker   schedule 10.09.2016ClassToTest
в качестве зависимости, поэтому я в основном извлекClassToTest
в интерфейс и предоставил фиктивную реализацию для целей тестирования, аналогично тому, что объясняется здесь - person seeker   schedule 11.09.2016