2011-03-07 212 views
3

我正在嘗試使用JUNIT和Mockito測試我的liferay portlet插件代碼。目前我正在模擬服務實現以返回模擬數據並測試功能。Liferay Junit-Mockito測試

我面臨的問題是,我需要測試一些代碼,這需要屬性: PropsUtil.get(「someKey」) 但是當我運行它作爲一個獨立的JUnit測試,PropsUtil不是從任何閱讀屬性文件。 有沒有什麼辦法可以在不改變源代碼的情況下從liferay屬性(portal * .properties)文件讀取測試?

回答

3

我用下面的方法:

  • 我的TestClass延伸BaseServiceTestCase(可在Liferay中SRC)
  • 保存portal-test.properties裏面的測試文件夾(帶有測試值)。
  • 運行測試用例。

在這種情況下,liferay加載所有屬性以及彈簧初始化。

0

除非您測試的值是在portal.properties中實際設置的,否則只需在您的測試中調用PropsUtil.set。

+0

您好我正在使用PropsUtil從portal-kernel.jar(an d不是來自portal-impl.jar),所以沒有設置方法可以手動設置值。 – simplysiby 2011-03-08 09:18:16

0

你需要調用InitUtil.init(),它初始化的基礎設施,屬性,包括...

如果你想更進一步,啓動甚至春季基礎設施,你需要有Liferay的庫在類路徑上。我在這篇博文中解釋瞭如何在maven環境中這樣做:how to use liferay third-party libraries in maven plugin SDK。如果你這樣做,那麼你所需要做的就是設置spring.configs和portal spring xml定義(基礎結構+那些需要使用spring服務的定義),並且調用Init.initWithSpring();,它負責啓動liferay門戶,它使用那些在spring.configs中混合使用的spring bean。你也需要稍微修改liferay屬性。但它確實取決於用例。

2

作爲最後的手段,您可以使用PowerMock和模擬PropsUtil.get()方法調用。最終,這是一個普通老式的Java-單和碼單件不那麼容易測試..

+1

Powermock增強了EasyMock和Mockito API,允許模擬靜態方法,非私有構造函數/變量/方法,最終類和方法等非公開代碼。你可能想要在這方面簡單一些,因爲在某些情況下,你可能應該重構你的代碼,而不是在方法內部戳和嘲弄十幾個調用。當然,這樣可以通過添加僅允許進行單元測試的方法來避免污染您的API。 – trafalmadorian 2011-05-10 07:23:38

0

您也可以嘲笑這樣的電話:

mockStatic(PropsUtil.class); 

when(
    PropsUtil.get(PropsKeys.SOCIAL_ACTIVITY_COUNTER_PERIOD_LENGTH) 
).thenReturn("1"); 
+0

感謝代碼Julio。但我不認爲mockStatic()是Mockito代碼的一部分。 – simplysiby 2012-07-10 16:53:06

1

您可以創建Props接口的Properties基於實現:

private static class MockProps implements Props { 
    private Properties properties = new Properties(); 

    MockProps addProperty(String key, String value) { 
     properties.setProperty(key, value); 
     return this; 
    } 

    @Override 
    public boolean contains(String key) { 
     return properties.containsKey(key); 
    } 

    @Override 
    public String get(String key) { 
     return properties.getProperty(key); 
    } 

    @Override 
    public String get(String key, Filter filter) { 
     throw new UnsupportedOperationException("not needed by mock"); 
    } 

    @Override 
    public String[] getArray(String key) { 
     throw new UnsupportedOperationException("not needed by mock"); 
    } 

    @Override 
    public String[] getArray(String key, Filter filter) { 
     throw new UnsupportedOperationException("not needed by mock"); 
    } 

    @Override 
    public Properties getProperties() { 
     return properties; 
    } 

    @Override 
    public Properties getProperties(String prefix, boolean removePrefix) { 
     return PropertiesUtil.getProperties(properties, prefix, removePrefix); 
    } 
} 

然後使用@BeforeClass進行配置:

@BeforeClass 
public static void init() { 
    PropsUtil.setProps(new MockProps() 
      .addProperty("key1", "silly") 
      .addProperty("key2", "silly again")); 
}