Ответ 2

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

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

Использование конструктора служб просто требует хорошего знания spring и загрузки классов.

Но перед этим нужно понять инфраструктуру. Нужно много хаков... Как

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

Ответ 3

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