使用 Liferay 6.2 进行单元测试

Unit testing with Liferay 6.2

我正在使用 liferay-plugins-sdk-6.2,我已经使用 Service Builder 创建了一个 table "patients" 和相应的模型和服务。现在我正在尝试为我的逻辑创建一个 JUnit 测试。我看了很多关于这个的论坛帖子,所以对于 6.2,我创建了以下结构:(顺便说一句:我正在使用 ant)

-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 代码的解决方法?

似乎 Spring 上下文未正确初始化。

尝试以下操作:

在您的测试 class 中,编写将调用 "InitUtil.initWithSpring()" 方法的设置方法。 使用@Test 注释

编写测试

特别是如果它是关于 Unit 测试,您应该能够在没有任何服务构建器初始化的情况下进行。恕我直言,涉及外部实体(如:数据库)的单元测试不是正确的单元测试。您应该能够将 Patient 接口的任何实现 class 传递给您的验证器以使其完成工作(您可能想测试验证器,而不是患者实现。

您不想unittest servicebuilder 的持久性有效。那更像是一个集成测试。

因此:只需 (TM) 通过自动生成方法、getter 和 setter 创建一个 PatientForTestImpl,或者使用一个常见的模拟库来即时执行此操作,并使用该对象来测试验证器。

我遇到了同样的问题。我尝试了不同的场景和测试库。

当我将 PowerMockito 作为测试框架包含在我的项目中时,我解决了我的问题。

尝试将 Mockito 或 PowerMockito 配置为您的测试框架。 如果您的测试再次失败,您可以按照 Olaf Kock 的建议尝试使用 wrapper 类。