2011-03-07 101 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")); 
}