2015-06-10 3 views
1

Я использую liferay-plugins-sdk-6.2, я создал таблицу «пациентов» и соответствующую модель и услуги с помощью Service Builder. Теперь я пытаюсь создать тест JUnit для своей логики. Я смотрел много потоков на форуме по этому поводу, так что для 6.2 я создал следующую структуру: (кстати: Я использую муравей)Тестирование модулей с помощью Liferay 6.2

-docroot 
-test 
    -unit 
    -src 
    -integration 
    -src 

И это та часть, которая дает мне неприятность ...

@Test 
public void testValidatePatient() throws SystemException { 
    Patient patient = new PatientImpl(); 
    ... 
} 

Когда я запускаю тест (от муравьиного теста), я получаю следующее исключение:

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

Поместите свою тестовую папку за пределы -docroot –

+0

Это вне docroot. Тесты папок и docroot являются братьями и сестрами. –

ответ

1

Особенно, если речь идет о Unit тестов вы должны быть в состоянии идти без инициализации службы строителя. IMHO единичный тест, который касается внешнего объекта (например: база данных), не является надлежащим модульным тестом. Вы должны быть в состоянии пройти любой класс реализации интерфейса Patient в свой валидатор для того, чтобы сделать работу (вы, вероятно, хотите, чтобы проверить валидатор, а не реализацию пациента.

Вы не хотите UnitTest что Это будет скорее интеграционный тест. Это будет скорее интеграционный тест.

Итак: Just (TM) создайте PatientForTestImpl путем автогенерации методов, геттеров и сеттеров или используйте одну из распространенных насмешливых библиотек, чтобы сделать это на лету и использовать этот объект для тестирования валидатора.

+0

Спасибо за ваш ответ, это звучит разумно. Вы правы, мое намерение состояло в том, чтобы проверить мою проверку пациента, и я просто хотел получить объект «Пациент», чтобы я мог заполнить некоторые данные. –

0

Похоже, что Spring Context неправильно инициализирован.

Попробуйте следующее:

В тестовом классе, написать метод установки, который будет вызывать "InitUtil.initWithSpring()" метод. Написать свой тест с аннотацией @Test

0

У меня была такая же проблема. различные сценарии и тестовые библиотеки.

Я решил свои проблемы, когда включил PowerMockito в качестве тестовой среды в своем проекте.

Попробуйте настроить Mockito или PowerMockito в качестве тестовой среды. Если ваши тесты снова не удались, вы можете попробовать использовать классы-оболочки, как предположил Олаф Кок.