Liferay 7 & JUnit: Утилита Mock Local Custom Local - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь подделать powermockito мой пользовательский локальный сервисный утилит, но я всегда получаю сообщение об ошибке.

@RunWith(PowerMockRunner.class)
@PrepareForTest({ServiceSubscriptionLocalServiceUtil.class})
public class CStreamTest {
    @Before
    public void setUp() throws NoSuchFieldException, IllegalAccessException {
        .........
        mockStatic(ServiceSubscriptionLocalServiceUtil.class);
        .........
    }
}

, и я получаю следующую ошибку:

java.lang.ExceptionInInitializerError at sun.reflect.GeneratedSerializationConstructorAccessor4.newInstance (Неизвестный источник) в java.lang.reflect.Constructor.newInstance (Constructor.java:423) в орг.Java: 48) в org.objenesis.ObjenesisBase.newInstance (ObjenesisBase.java:73) в org.mockito.internal.creation.instance.ObjenesisInstantiator.newInstance (ObjenesisInstantiator.java:19) в org.teckit.SubclassByteBuddyMockMaker.createMock (SubclassByteBuddyMockMaker.java:47) atg: 41) в org.mockito.internal.util.MockUtil.createMock (MockUtil.java:35) в org.mockito.internal.MockitoCore.mock (MockitoCore.java:62) в org.mockito.Mockito.mock (Mockito.java:1896) в org.powermock.api.mockito.internal.mockcreation..DefaultMockCreator.createMock (DefaultMockCreator.java:53) в org.powermock.api.mockito.internal.mockcreation.DefaultMockCreator.mock (DefaultMockCreator.java:40) в org.powermock.api.mockito.ock: 62) в com.ecstream.impl.test.CStreamTest.setUp (CStreamTest.java:50)

я добавляю некоторые части моего pom.xml:

<dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.12.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.24.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-core</artifactId>
        <version>2.0.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>2.0.0</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito2</artifactId>
        <version>2.0.0</version>
        <scope>test</scope>
    </dependency>

Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Обычно служебные классы сервисов, создаваемые компоновщиком сервисов, не имеют конструктора no arg, даже конструктора в этом отношении.Но если вы проверите журнал, который увидите, это ваша проблема:

Новый экземпляр класса создается внутри PowerMock.

java.lang.ExceptionInInitializerError at sun.reflect.GeneratedSerializationConstructorAccessor4.newInstance (Неизвестный источник) После попытки создать экземпляр для: ObjenesisBase ....

Несмотря на то, что в нем нет конструкторов, служб Утилиты обычно инициализируют статические элементы , как ServiceTracker.

Вы можете создать поддельную службу, или ваш код может использовать ссылку на службу вместо утилиты, вы можете издеваться над этим парнем.Здесь есть несколько вариантов, даже насмешливые методы, которые дают вам услугу, чтобы предоставить вам фиктивную услугу.

Но в итоге вы не можете просто сделать:

mockStatic(ServiceSubscriptionLocalServiceUtil.class);

Поскольку это создаст экземпляр,и этот экземпляр имеет статические члены, которые должны быть инициализированы.

0 голосов
/ 20 февраля 2019

Классы *LocalServiceUtil Liferay содержат набор статических методов, которые просто упрощают поиск реальной реализации сервиса.Учитывая, что вы заявляете, что используете Liferay 7, вам следует просто использовать сами сервисы и полагаться на @Reference управление зависимостями и внедрение в код, который их использует.Таким образом, вам просто нужно смоделировать обычный интерфейс, который не загружен с некоторой реализацией и поиском по умолчанию.

Другой вариант - протестировать реализацию - и написать тесты для кода «выше» сервиса, а также его реализации.Как правило, сложно писать код уровня пользовательского интерфейса, например портлеты, в режиме, основанном на тестировании, где макетирование не сильно зависит от реализации службы и вызывающих классов.

...