Powermockito whenNew возвращает ноль, если не соответствует - PullRequest
0 голосов
/ 12 декабря 2018

Я не знаю, должен ли он это делать, но, наверное, нет.Посмотрите на мой код ниже.

File mocked = PowerMockito.mock(File.class);    
PowerMockito.whenNew(File.class).withParameterTypes(String.class).withArguments(eq(THE_TARGET_PATH)).thenReturn(mocked);
File normalFile = new File(WORKING_PATH);
File mockedFile = new File(THE_TARGET_PATH);

Я ожидаю, что normalFile будет создан нормально, но на самом деле это null.mockedFile проверено правильно между прочим.

Я также использую @RunWith(PowerMockRunner.class) и @PrepareForTest({ClassWhereInstanceIsCreated.class, File.class})

, и я использую:

<dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-core</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>

1 Ответ

0 голосов
/ 12 декабря 2018

Мой вывод показывает, что нет хорошего способа выполнить частичное моделирование конструктора с 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);

Это нежелательное решение, но я не мог предложить ничего лучшего.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...