我正在使用liferay-plugins-sdk-6.2,我使用Service Builder创建了一个表“patients”和相应的模型和服务。现在我正在尝试为我的逻辑创建一个JUnit测试。我看了很多关于这个的论坛帖子,所以对于6.2我创建了以下结构:(顺便说一句:我使用的是蚂蚁)
-docroot
-test
-unit
-src
-integration
-src
这是给我带来麻烦的部分......
@Test
public void testValidatePatient() throws SystemException {
Patient patient = new PatientImpl();
...
}
当我运行测试时(来自ant测试),我得到以下异常:
java.lang.ExceptionInInitializerError
PatientModelImpl.<clinit>(PatientModelImpl.java:92)
ValidatorUtilTest.testValidatePatient(ValidatorUtilTest.java:29)
Caused by: java.lang.NullPointerException
at com.liferay.portal.kernel.configuration.ConfigurationFactoryUtil.getConfiguration(ConfigurationFactoryUtil.java:27)
at com.liferay.util.service.ServiceProps.<init>(ServiceProps.java:66)
at com.liferay.util.service.ServiceProps.<clinit>(ServiceProps.java:70)
这引出了我这个神奇的代码:
public static final boolean ENTITY_CACHE_ENABLED = GetterUtil.getBoolean(com.liferay.util.service.ServiceProps.get(
"value.object.entity.cache.enabled.com.methodia.khearos.model.Patient"),
true);
似乎ServiceProps无法正确实例化,因此(仅用于测试)我删除了ServiceProps.get调用并放置了相应的默认值。在那之后,我再次进行测试,一切都像魅力一样。
所以我的问题是如何正确配置,所以我会有一个配置?或者是否有任何其他解决方法不需要我修改Service Builder代码?
答案 0 :(得分:1)
特别是如果它涉及单元测试,您应该能够在没有任何服务构建器初始化的情况下进行。恕我直言,触摸外部实体(如:数据库)的单元测试不是一个适当的单元测试。您应该能够将Patient
接口的任何实现类传递给验证器,以便它完成工作(您可能希望测试验证器,而不是患者实现。
您不希望 unittest 该服务构建器的持久性有效。那宁愿是整合测试。
所以:Just(TM)通过自动生成方法,getter和setter来创建PatientForTestImpl
,或者使用一个常见的模拟库来动态执行此操作并使用该对象来测试验证器。
答案 1 :(得分:0)
看起来Spring Context没有正确初始化。
尝试以下方法:
在您的测试类中,编写setup方法,该方法将调用“InitUtil.initWithSpring()”方法。 使用@Test注释
编写测试答案 2 :(得分:0)
我遇到了同样的问题。我尝试了不同的场景和测试库。
当我将PowerMockito作为测试框架包含在我的项目中时,我解决了我的问题。
尝试将Mockito或PowerMockito配置为您的测试框架。 如果您的测试再次失败,您可以尝试使用包装类,如Olaf Kock建议的那样。