Мой вывод показывает, что нет хорошего способа выполнить частичное моделирование конструктора с PowerMockito / PowerMockito 2. По логике вы должны иметь возможность сделать что-то вроде
PowerMockito.whenNew(File.class).withParameterTypes(String.class)
.withArguments(eq(WORKING_PATH)).thenCallRealMethod();
Но это вызовет внутреннее исключение вPowerMockito, похожий на этот
org.mockito.exceptions.base.MockitoException: Невозможно вызвать абстрактный реальный метод для объекта Java!Вызов реальных методов возможен только при использовании неабстрактного метода.// правильный пример: when (mockOfConcreteClass.nonAbstractMethod ()). thenCallRealMethod ();
Таким образом, единственный способ увидеть это переписать тест.Вы должны сначала сконструировать все необходимые File
объекты, а затем создавать конструктор и дать PowerMockito правила, которые нужно возвращать в каждом конкретном случае.
File mocked = Mockito.mock(File.class);
// create file as you want
File realFile = new File(WORKING_PATH);
// tell PowerMockito to return it
PowerMockito.whenNew(File.class).withParameterTypes(String.class)
.withArguments(Mockito.eq(WORKING_PATH)).thenReturn(realFile);
// tell PowerMockito to return mock if other argument passed
PowerMockito.whenNew(File.class).withParameterTypes(String.class)
.withArguments(Mockito.eq(THE_TARGET_PATH)).thenReturn(mocked);
File normalFile = new File(WORKING_PATH);
File mockedFile = new File(THE_TARGET_PATH);
Это нежелательное решение, но я не мог предложить ничего лучшего.
Надеюсь, это поможет!