Модульное тестирование в Liferay - PullRequest
4 голосов
/ 19 января 2011

Кто-нибудь знает, как запускать модульные тесты для портлетов Liferay? Я нашел много сообщений об этом (например, http://agile -reflections.opnworks.com / 2010/06 / portlet-unit-testing-with-liferay-6.html ), но, тем не менее, не работает.

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

Это может быть излишним, но если вы ищете подход Enterprise с непрерывным интеграционным тестированием, этот блог дает очень хороший пример: Непрерывная интеграция в Liferay: запуск ваших тестов Selenium 2 в комплекте Tomcat 6

0 голосов
/ 07 августа 2011

Модульное тестирование портлетов Liferay довольно сложно, когда используется ServiceBuilder.

Причина в том, что он генерирует довольно тяжелые сервисы, которые содержат ссылки не только на bean-объекты внутри Portlet, но даже на bean-компоненты Portal, генерируемые ServiceBuilder.

Есть такие инструменты, как InitUtil.init (); это позволяет вам по крайней мере создавать экземпляры и использовать объекты ServiceBuilder ... но не EntityServices. Для этого вам нужно использовать SpringUtil.loadContext (); что требует

System.setProperty("external-properties", "testing.properties");

, где testing.properties содержит:

spring.configs=META-INF/ext-spring.xml,\
            META-INF/base-spring.xml,\
            META-INF/dynamic-data-source-spring.xml,\
            META-INF/infrastructure-spring.xml,\
            META-INF/shard-data-source-spring.xml,\
            META-INF/hibernate-spring.xml,\
            META-INF/portlet-spring.xml

Это определения пружин, которые должны быть загружены для тестирования контекста приложения. Все бы хорошо, но бины из portlet-spring.xml - это те тяжелые сервисы, которые содержат ссылки на определения bean-компонентов Portal, такие как ResourceService, UserLocalService, CounterLocalService, и вам придется загружать даже META-INF/portal-spring.xml и доверять мне, тогда это не так просто, потому что вам придется загружать довольно много других вещей.

ОТВЕТ:

Правда заключается в том, что вам, скорее всего, не придется выполнять юнит-тестирование служб SB портлета, никогда. Они представляют сущности с постоянством и уровнем обслуживания вокруг. То, что не должно быть проверено. Надо просто издеваться над ними и заглушить их методы, верно?

И лучший способ для тестирования юнитов и интеграций в отношении имитации - не использовать в вашем приложении статические классы * LocalServiceUtil, потому что это почти немодально.

Вам просто нужно создать Spring FactoryBean:

public class PortalFactoryBean implements FactoryBean {
    private Class type;

    public void setType(final Class type) {
        this.type = type;
    }

    @Override
    public Object getObject() throws Exception {
        return PortalBeanLocatorUtil.locate(type.getName());
    }

    @Override
    public Class getObjectType() {
        return type;
    }
}

public class PortletFactoryBean implements FactoryBean {
    private Class type;

    public void setType(final Class type) {
        this.type = type;
    }

    @Override
    public Object getObject() throws Exception {
        return PortletBeanLocatorUtil.locate(type.getName());
    }

    @Override
    public Class getObjectType() {
        return type;
    }
}

<bean id="somePortalBean" class="example.spring.PortalFactoryBean" lazy-init="true">
   <property name="type" value="com.liferay.some.util.SomeService"/>
</bean>

<bean id="somePortletBean" class="example.spring.PortletFactoryBean" lazy-init="true">
   <property name="type" value="com.example.SomeService"/>
</bean>

@Autowired
private SomeService somePortalBean;

Написание модульных / интеграционных тестов для этого портлета было бы довольно просто, верно? Вы просто создаете пружинный контекст для тестирования и издеваетесь над этими сервисами:

Использование Service Builder стоит того, но вы должны иметь некоторые знания Spring и поиграть с ним некоторое время. Тогда это сэкономит много времени, потому что его легко обслуживать.

0 голосов
/ 26 июля 2011

Вам нужно иметь сторонние библиотеки в classpath .

Ключевым моментом является наличие даже portal-impl.jar и других зависимостей портала от classpath и наличие InitUtil.initWithSpring(boolean); загрузки основных конфигураций xml основной пружины, которые вы указываете в spring-ext.properties только в свойстве spring.congigsте услуги, которые вам нужны.Возможно, вам не нужны никакие сервисы портала, а только портлетные, но это проблема, потому что ваши сервисы портлетов, генерируемые компоновщиком сервисов, используют сервисы портала.

Чтобы использовать сервис-компоновщик, нужно просто хорошо знать весну и загрузку классов.

Но прежде чем делать это, вам нужно понять инфраструктуру.Требуется довольно много взломов ... Как

BeanLocator beanLocator = new BeanLocatorImpl(PortalClassLoaderUtil.getClassLoader(), ac);
PortletBeanLocatorUtil.setBeanLocator("portlet", beanLocator);
...