2011-01-18 8 views
4

誰かがLiferayポートレットのユニットテストを実行する方法を知っていますか?それに関連する投稿が多数見つかりました(例:http://agile-reflections.opnworks.com/2010/06/portlet-unit-testing-with-liferay-6.html)が、それにもかかわらずどれも機能しません。Liferayのユニットテスト

+0

あなたがユニットにしたいですポートレットに建てられた独自のポートレットやLiferayのをテスト? – blank

+0

Service Builderを使用して私が作成したサービスを使用して、私自身のポートレットを単体テストする必要があります。 – brandizzi

答えて

0

You need to have some third party libraries on classpath

key-pointはportal-impl.jarとclasspathに他のポータルの依存関係があり、InitUtil.initWithSpring(boolean); spring.congigsプロパティのspring-ext.propertiesで指定するcore spring xml configsをロードする必要があるサービスのみ。ポータルサービスは必要なく、ポートレットサービスだけが必要な場合もありますが、サービスビルダーによって生成されたポートレットサービスがポータルサービスを使用するため、これは問題です。

サービスビルダーを使用するには、春とクラスローディングの知識が必要です。

インフラストラクチャを理解する必要があります。多くのハックが必要です...

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

私はまだこのコードを理解しようとしています:)何か動作した後にコメントします。 – brandizzi

0

ユニットテストLiferayポートレットは、ServiceBuilderを利用すると非常に複雑です。

理由は、ポートレット内のBeanだけでなく、ServiceBuilderによって生成されたPortal Beanへの参照を含む非常に重いサービスを生成するためです。

InitUtil.init()のようなツールがあります。 ServiceBuilderエンティティをインスタンス化して使用することができますが、EntityServicesは使用できません。そのためには、SpringUtil.loadContext()を使用する必要があります。

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 

は、これらは、テストアプリケーションコンテキストのためにロードされる春の定義は以下のとおりです。それはtesting.propertiesが含まれてい

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

が必要です。それはすべてOKですが、portlet-spring.xmlのBeanは、ResourceService、UserLocalService、CounterLocalServiceなどのポータルBean定義への参照を含む重いサービスであり、さらにMETA-INF/portal-spring.xmlをロードして信頼する必要があります。それは簡単な理由ではありませんかなり多くの他のものをロードする必要があります。

ANSWER:

真実は、あなたが最も可能性の高いユニット・テスト・ポートレットSBサービスに持っていないことを、決してありません。それらは、永続性とサービス層を持つエンティティを表します。テストされるべきではないもの。あなたはそれらを嘲笑して、それらの方法をスタブしなければなりません、そうですか?

mockingに関するjunitと統合テストの最善の方法は、アプリケーション内で* LocalServiceUtil静的クラスを使用しないことです。これは、ほとんどモックできないためです。あなただけの春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; 

は、このポートレットのユニット/統合テストを書くには、右、非常に簡単でしょうか?あなただけのテストのために春のコンテキストを作成して、あなたはこれらのサービスをあざけり:

サービスビルダを使用して

はそれだけの価値があるが、あなたは、いくつかの春の知識を持っているし、いくつかの時間のためにそれで遊ぶ必要があります。それは維持しやすいので、それは多くの時間を惜しまない。

+0

これは洗練された解決策ですが、本当にそのような普遍的な解決策を模索していますか?私はどのように私は[カスタムクエリ](http://www.liferay.com/pt/community/wiki/-/wiki/Main/Custom+queries+in+Liferay+5.2)またはいくつかをテストするためにそれを使用することができません例えば、サービスにおける動的クエリを使用する方法。これらのメソッドは、少なくとも私のコードでは頻繁にテストされるべきであり、嘲笑されるのは簡単ではありません。それにもかかわらず、あなたの答えは、今のところいろいろな状況で役に立ちます。 – brandizzi

+0

私はportal-impl/testをビルドしてテストクラスパス上に置いてみましたが、すべてのMETA-INF/spring-definitionsをリストするportal.propertiesを持つServiceTestUtil.initPermissions()とServiceTestUtil.initServices()を呼び出しました.xmlと私はそれらをすべて+私のext-springにロードしました。ここで私はポートレットコンテキストからBeanを配置しました。間違いなくすべてのBeanが読み込まれているため、これは動作しますが、非常に遅いです。あなたのクラスパスにもそれがあれば、ポータルを「カバー」するので、あなたのポートレットでMETA-INFの名前を変更する必要があります。それは多くの仕事の人 – lisak

+0

正確に...次のプロジェクト私はそれが価値があるかどうか、結果の利点を見るためにServiceBuilderを使用することを避けるつもりです... – lisak

関連する問題