我正在嘗試使用JUNIT和Mockito測試我的liferay portlet插件代碼。目前我正在模擬服務實現以返回模擬數據並測試功能。Liferay Junit-Mockito測試
我面臨的問題是,我需要測試一些代碼,這需要屬性: PropsUtil.get(「someKey」) 但是當我運行它作爲一個獨立的JUnit測試,PropsUtil不是從任何閱讀屬性文件。 有沒有什麼辦法可以在不改變源代碼的情況下從liferay屬性(portal * .properties)文件讀取測試?
我正在嘗試使用JUNIT和Mockito測試我的liferay portlet插件代碼。目前我正在模擬服務實現以返回模擬數據並測試功能。Liferay Junit-Mockito測試
我面臨的問題是,我需要測試一些代碼,這需要屬性: PropsUtil.get(「someKey」) 但是當我運行它作爲一個獨立的JUnit測試,PropsUtil不是從任何閱讀屬性文件。 有沒有什麼辦法可以在不改變源代碼的情況下從liferay屬性(portal * .properties)文件讀取測試?
我用下面的方法:
在這種情況下,liferay加載所有屬性以及彈簧初始化。
除非您測試的值是在portal.properties中實際設置的,否則只需在您的測試中調用PropsUtil.set。
你需要調用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屬性。但它確實取決於用例。
作爲最後的手段,您可以使用PowerMock和模擬PropsUtil.get()
方法調用。最終,這是一個普通老式的Java-單和碼單件不那麼容易測試..
Powermock增強了EasyMock和Mockito API,允許模擬靜態方法,非私有構造函數/變量/方法,最終類和方法等非公開代碼。你可能想要在這方面簡單一些,因爲在某些情況下,你可能應該重構你的代碼,而不是在方法內部戳和嘲弄十幾個調用。當然,這樣可以通過添加僅允許進行單元測試的方法來避免污染您的API。 – trafalmadorian 2011-05-10 07:23:38
您也可以嘲笑這樣的電話:
mockStatic(PropsUtil.class);
when(
PropsUtil.get(PropsKeys.SOCIAL_ACTIVITY_COUNTER_PERIOD_LENGTH)
).thenReturn("1");
感謝代碼Julio。但我不認爲mockStatic()是Mockito代碼的一部分。 – simplysiby 2012-07-10 16:53:06
您可以創建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"));
}
您好我正在使用PropsUtil從portal-kernel.jar(an d不是來自portal-impl.jar),所以沒有設置方法可以手動設置值。 – simplysiby 2011-03-08 09:18:16