Тестирование сервиса Mockito Liferay

Я пытаюсь протестировать свои классы LocalServiceUtil, созданные построителем сервисов, с помощью PowerMock, но всегда получаю «null» или «0» из методов Util.

Тестовый класс

@RunWith(PowerMockRunner.class)
@PrepareForTest(EntityLocalServiceUtil.class)
public class EntityTest {

        @Test
        public void testGetAnswer() throws PortalException, SystemException {
                PowerMockito.mockStatic(EntityLocalServiceUtil.class);
                assertEquals("hello", EntityLocalServiceUtil.getHello());
        }
}

Класс Util содержит

public static java.lang.String getHello() {
            return getService().getHello();
}

и эта служба корректно работает с развернутым портлетом. Что я делаю неправильно?


person dmitrievanthony    schedule 16.08.2012    source источник
comment
Вы должны предоставить реализацию getService().   -  person gontard    schedule 16.08.2012


Ответы (1)


Вы забыли издеваться над методом:

    @Test
    public void testGetAnswer() throws PortalException, SystemException {
            PowerMockito.mockStatic(EntityLocalServiceUtil.class);
            when(EntityLocalServiceUtil.getHello()).thenReturn("hello"); // <- here
            assertEquals("hello", EntityLocalServiceUtil.getHello());
    }
person Mark    schedule 16.08.2012
comment
Хорошо, но где мы тестируем метод? В этом случае EntityLocalServiceUtil.getHello() всегда будет возвращать приветствие, но метод из классов Util и Impl вызываться не будет, верно? - person dmitrievanthony; 16.08.2012
comment
да. Целью модульного тестирования является проверка только вашего кода модуля, независимо от других классов. Поэтому вам необходимо инкапсулировать этот код из другой инфраструктуры, такой как Services of Liferay. Что вы можете сделать с фиктивным подходом. - person Mark; 16.08.2012
comment
См. подход с PowerMock здесь тестирование настраиваемого плагина портлета beanlocatorexception и транзакции roll bac">stackoverflow.com/questions/9701539/ . Там у нас есть независимый метод расчета возраста, но этот метод получает Пользователя от UserLocalServiceUtil, поэтому для Теста мы инкапсулируем логику UserLocalServiceUtil и тестируем только наш метод расчета возраста. - person Mark; 16.08.2012
comment
Но как напрямую использовать классы Util без методов/полей реализации чего-то особенного для тестовых классов? Я нахожу только одно решение - развернуть тестовый портлет на сервере и запустить с помощью JUnitCore.runClasses(...) Есть ли подобное решение, но для выполнения с помощью ant? - person dmitrievanthony; 16.08.2012
comment
Если вам нужен юнит-тест, то вам не нужно что-то развертывать на сервере. Юнит-тесты в основном тестируют логику небольших программ, без сервера и другой инфраструктуры. Может быть, вам нужен интеграционный тест? - person Mark; 17.08.2012
comment
Да, теперь я тоже так думаю. Спасибо. - person dmitrievanthony; 17.08.2012