3

我正在尝试使用 JUNIT 和 Mockito 测试我的 liferay portlet 插件代码。目前我正在模拟服务实现以返回模拟数据并测试功能。

我面临的问题是,我需要测试一些具有以下属性的代码: PropsUtil.get("someKey") 但是当我将它作为独立的 JUNIT 测试运行时,PropsUtil 没有从任何属性文件中读取。有什么方法可以在不更改源代码的情况下从 liferay 属性 (portal*.properties) 文件中读取测试?

4

6 回答 6

3

我使用了以下方法:

  • 我的 TestClass 扩展了 BaseServiceTestCase(在 liferay src 中可用)
  • portal-test.properties保存在测试文件夹中(带有测试值)。
  • 运行测试用例。

在这种情况下,liferay 会加载所有属性以及弹簧初始化。

于 2012-07-02T11:29:59.267 回答
2

作为最后的手段,您可以使用PowerMock和模拟PropsUtil.get()方法调用。最终它是一个普通的-old-java-singleton,并且带有单例的代码并不是那么容易测试..

于 2011-03-07T16:01:44.643 回答
2

您可以创建接口的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" ) );
}
于 2015-08-18T21:43:20.317 回答
0

除非您测试的值实际上是在 portal.properties 中设置的,否则只需在测试中调用 PropsUtil.set。

于 2011-03-07T15:16:37.763 回答
0

你需要调用 InitUtil.init() 来初始化基本的基础设施,属性包括......

如果你想更进一步甚至启动 Spring 基础设施,你需要在类路径上有 liferay 库。我在这篇博文中解释了如何在 maven 环境中执行此操作:如何在 maven 插件 SDK 中使用 liferay 第三方库。如果你这样做了,那么你需要做的就是设置 spring.configs 与门户 spring xml 定义(基础设施 + 那些你需要使用的 spring 服务)并调用Init.initWithSpring();它来处理启动 liferay 门户并使用这些您在 spring.configs 中混合的 spring bean。您还需要稍微修改 liferay 属性。但这实际上取决于用例。

于 2011-03-07T15:50:25.277 回答
0

你也可以像这样模拟调用:

mockStatic(PropsUtil.class);

when(
  PropsUtil.get(PropsKeys.SOCIAL_ACTIVITY_COUNTER_PERIOD_LENGTH)
).thenReturn("1");
于 2012-07-10T10:08:12.680 回答