Ответ 1
Это может быть излишним, но если вы ищете подход Enterprise с непрерывным интеграционным тестированием, этот блог дает очень хороший пример: Непрерывная интеграция на Liferay: запуск тестов Selenium 2 на пакете Tomcat 6
Кто-нибудь знает, как запускать модульные тесты для портлетов Liferay? Я нашел много сообщений об этом (например, http://agile-reflections.opnworks.com/2010/06/portlet-unit-testing-with-liferay-6.html), но ни один из них не работает.
Это может быть излишним, но если вы ищете подход Enterprise с непрерывным интеграционным тестированием, этот блог дает очень хороший пример: Непрерывная интеграция на Liferay: запуск тестов Selenium 2 на пакете Tomcat 6
Вам нужно иметь сторонние библиотеки в пути к классам.
Ключевым моментом является наличие отношений портала-impl.jar и других порталов от пути к классам и InitUtil.initWithSpring(boolean);
загрузка основных конфигураций spring xml, которые вы указываете в spring -ext.properties в spring.congigs собственность, только те услуги, в которых вы нуждаетесь. Вам не нужны никакие сервисы портала и только портлеты, но это проблема, потому что ваши службы портлета, созданные сервис-строителем, используют службы портала.
Использование конструктора служб просто требует хорошего знания spring и загрузки классов.
Но перед этим нужно понять инфраструктуру. Нужно много хаков... Как
BeanLocator beanLocator = new BeanLocatorImpl(PortalClassLoaderUtil.getClassLoader(), ac);
PortletBeanLocatorUtil.setBeanLocator("portlet", beanLocator);
Модульное тестирование Портлеты Liferay довольно сложны при использовании ServiceBuilder.
Причина в том, что он генерирует довольно тяжелые службы, содержащие ссылки не только на beans в портлете, но даже на портал beans, сгенерированный ServiceBuilder.
Существуют такие инструменты, как InitUtil.init(); который позволяет вам как минимум создавать экземпляры и использовать объекты ServiceBuilder... но не EntityServices. Для этого вам придется использовать SpringUtil.loadContext(); для чего требуется
System.setProperty("external-properties", "testing.properties");
где test.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
Это spring определения, которые необходимо загрузить для тестирования контекста приложения. Все было бы в порядке, но beans from portlet- spring.xml - это те тяжелые службы, которые содержат ссылки на определения Portal bean, такие как ResourceService, UserLocalService, CounterLocalService, и вам придется загружать даже META-INF/portal-spring.xml
и доверять мне, это не так просто, потому что вам придется загружать довольно много других вещей.
ОТВЕТ:
По правде говоря, вы, скорее всего, не будете иметь unit test портлетные службы SB, никогда. Они представляют объекты с постоянством и уровнем обслуживания. Что-то, что нельзя тестировать. Вам просто нужно издеваться над ними и заглушить их методы, верно?
И лучший способ для junit и интеграционного тестирования в отношении насмешек не использует статические классы 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;
Тесты записи/интеграции для этого портлета были бы довольно легкими, верно? Вы просто создаете контекст spring для тестирования, и вы издеваетесь над этими службами:
Использование Service Builder стоит того, но вы должны иметь некоторое знание spring и играть с ним в течение некоторого времени. Затем он экономит много времени, потому что его легко поддерживать.