我正在尝试使用 JUNIT 和 Mockito 测试我的 liferay portlet 插件代码。目前我正在模拟服务实现以返回模拟数据并测试功能。
我面临的问题是,我需要测试一些具有以下属性的代码: PropsUtil.get("someKey") 但是当我将它作为独立的 JUNIT 测试运行时,PropsUtil 没有从任何属性文件中读取。有什么方法可以在不更改源代码的情况下从 liferay 属性 (portal*.properties) 文件中读取测试?
我正在尝试使用 JUNIT 和 Mockito 测试我的 liferay portlet 插件代码。目前我正在模拟服务实现以返回模拟数据并测试功能。
我面临的问题是,我需要测试一些具有以下属性的代码: PropsUtil.get("someKey") 但是当我将它作为独立的 JUNIT 测试运行时,PropsUtil 没有从任何属性文件中读取。有什么方法可以在不更改源代码的情况下从 liferay 属性 (portal*.properties) 文件中读取测试?
我使用了以下方法:
在这种情况下,liferay 会加载所有属性以及弹簧初始化。
作为最后的手段,您可以使用PowerMock和模拟PropsUtil.get()
方法调用。最终它是一个普通的-old-java-singleton,并且带有单例的代码并不是那么容易测试..
您可以创建接口的Properties
基于实现Props
:
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 );
}
}
然后使用 an@BeforeClass
来配置它:
@BeforeClass
public static void init() {
PropsUtil.setProps( new MockProps()
.addProperty( "key1", "silly" )
.addProperty( "key2", "silly again" ) );
}
除非您测试的值实际上是在 portal.properties 中设置的,否则只需在测试中调用 PropsUtil.set。
你需要调用 InitUtil.init() 来初始化基本的基础设施,属性包括......
如果你想更进一步甚至启动 Spring 基础设施,你需要在类路径上有 liferay 库。我在这篇博文中解释了如何在 maven 环境中执行此操作:如何在 maven 插件 SDK 中使用 liferay 第三方库。如果你这样做了,那么你需要做的就是设置 spring.configs 与门户 spring xml 定义(基础设施 + 那些你需要使用的 spring 服务)并调用Init.initWithSpring();
它来处理启动 liferay 门户并使用这些您在 spring.configs 中混合的 spring bean。您还需要稍微修改 liferay 属性。但这实际上取决于用例。
你也可以像这样模拟调用:
mockStatic(PropsUtil.class);
when(
PropsUtil.get(PropsKeys.SOCIAL_ACTIVITY_COUNTER_PERIOD_LENGTH)
).thenReturn("1");