我正在尝试使用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