Модульное тестирование портлетов 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 и поиграть с ним некоторое время. Тогда это сэкономит много времени, потому что его легко обслуживать.