/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.dynamic.data.mapping; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldRenderer; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldType; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeServicesTracker; import com.liferay.dynamic.data.mapping.form.field.type.DDMFormFieldTypeSettings; import com.liferay.dynamic.data.mapping.internal.util.DDMImpl; import com.liferay.dynamic.data.mapping.io.DDMFormJSONDeserializer; import com.liferay.dynamic.data.mapping.io.DDMFormJSONSerializer; import com.liferay.dynamic.data.mapping.io.internal.DDMFormJSONDeserializerImpl; import com.liferay.dynamic.data.mapping.io.internal.DDMFormJSONSerializerImpl; import com.liferay.dynamic.data.mapping.model.DDMForm; import com.liferay.dynamic.data.mapping.model.DDMFormField; import com.liferay.dynamic.data.mapping.model.DDMFormLayoutColumn; import com.liferay.dynamic.data.mapping.model.DDMFormLayoutRow; import com.liferay.dynamic.data.mapping.model.DDMStructure; import com.liferay.dynamic.data.mapping.model.DDMTemplate; import com.liferay.dynamic.data.mapping.model.LocalizedValue; import com.liferay.dynamic.data.mapping.model.Value; import com.liferay.dynamic.data.mapping.model.impl.DDMStructureImpl; import com.liferay.dynamic.data.mapping.model.impl.DDMTemplateImpl; import com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil; import com.liferay.dynamic.data.mapping.service.DDMTemplateLocalServiceUtil; import com.liferay.dynamic.data.mapping.storage.DDMFormFieldValue; import com.liferay.dynamic.data.mapping.storage.DDMFormValues; import com.liferay.dynamic.data.mapping.storage.Field; import com.liferay.dynamic.data.mapping.storage.Fields; import com.liferay.dynamic.data.mapping.test.util.DDMFormFieldTypeSettingsTestUtil; import com.liferay.portal.json.JSONFactoryImpl; import com.liferay.portal.kernel.configuration.Configuration; import com.liferay.portal.kernel.configuration.ConfigurationFactory; import com.liferay.portal.kernel.configuration.ConfigurationFactoryUtil; import com.liferay.portal.kernel.json.JSONFactoryUtil; import com.liferay.portal.kernel.language.Language; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.test.util.RandomTestUtil; import com.liferay.portal.kernel.util.HtmlUtil; import com.liferay.portal.kernel.util.LocaleUtil; import com.liferay.portal.kernel.util.LocalizationUtil; import com.liferay.portal.kernel.util.PortalClassLoaderUtil; import com.liferay.portal.kernel.util.ReflectionUtil; import com.liferay.portal.kernel.util.ResourceBundleUtil; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import com.liferay.portal.kernel.xml.UnsecureSAXReaderUtil; import com.liferay.portal.util.HtmlImpl; import com.liferay.portal.util.LocalizationImpl; import com.liferay.portal.util.PropsValues; import com.liferay.portal.xml.SAXReaderImpl; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import org.junit.Before; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; import org.powermock.modules.junit4.PowerMockRunner; /** * @author Pablo Carvalho * @author Miguel Angelo Caldas Gallindo */ @PrepareForTest( { DDMStructureLocalServiceUtil.class, DDMTemplateLocalServiceUtil.class, LocaleUtil.class, PortalClassLoaderUtil.class, ResourceBundleUtil.class } ) @RunWith(PowerMockRunner.class) @SuppressStaticInitializationFor( { "com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil", "com.liferay.dynamic.data.mapping.service.DDMTemplateLocalServiceUtil" } ) public abstract class BaseDDMTestCase extends PowerMockito { @Before public void setUp() throws Exception { setUpPortalClassLoaderUtil(); setUpResourceBundleUtil(); } protected void addDDMFormFields( DDMForm ddmForm, DDMFormField... ddmFormFieldsArray) { List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields(); for (DDMFormField ddmFormField : ddmFormFieldsArray) { ddmFormFields.add(ddmFormField); } } protected void addNestedTextDDMFormFields( DDMFormField ddmFormField, String... fieldNames) { List<DDMFormField> nestedDDMFormFields = ddmFormField.getNestedDDMFormFields(); for (String fieldName : fieldNames) { nestedDDMFormFields.add(createTextDDMFormField(fieldName)); } } protected void addTextDDMFormFields(DDMForm ddmForm, String... fieldNames) { List<DDMFormField> ddmFormFields = ddmForm.getDDMFormFields(); for (String fieldName : fieldNames) { ddmFormFields.add(createTextDDMFormField(fieldName)); } } protected Element addTextElement( Element element, String name, String label, boolean localizable) { Element dynamicElement = element.addElement("dynamic-element"); dynamicElement.addAttribute("dataType", "string"); dynamicElement.addAttribute("localizable", String.valueOf(localizable)); dynamicElement.addAttribute("name", name); dynamicElement.addAttribute("type", "text"); Element metadataElement = dynamicElement.addElement("meta-data"); metadataElement.addAttribute( "locale", LocaleUtil.toLanguageId(LocaleUtil.US)); Element entryElement = metadataElement.addElement("entry"); entryElement.addAttribute("name", "label"); entryElement.setText(label); return dynamicElement; } protected Set<Locale> createAvailableLocales(Locale... locales) { Set<Locale> availableLocales = new LinkedHashSet<>(); for (Locale locale : locales) { availableLocales.add(locale); } return availableLocales; } protected Field createBRField( long ddmStructureId, String fieldName, List<Serializable> ptValues) { return new MockField( ddmStructureId, fieldName, ptValues, LocaleUtil.BRAZIL); } protected DDMForm createDDMForm( Set<Locale> availableLocales, Locale defaultLocale) { DDMForm ddmForm = new DDMForm(); ddmForm.setAvailableLocales(availableLocales); ddmForm.setDefaultLocale(defaultLocale); return ddmForm; } protected DDMForm createDDMForm(String... fieldNames) { DDMForm ddmForm = createDDMForm( createAvailableLocales(LocaleUtil.US), LocaleUtil.US); addTextDDMFormFields(ddmForm, fieldNames); return ddmForm; } protected DDMFormFieldValue createDDMFormFieldValue( String instanceId, String name, Value value) { DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue(); ddmFormFieldValue.setInstanceId(instanceId); ddmFormFieldValue.setName(name); ddmFormFieldValue.setValue(value); return ddmFormFieldValue; } protected DDMFormFieldValue createDDMFormFieldValue( String name, Value value) { return createDDMFormFieldValue(StringUtil.randomString(), name, value); } protected DDMFormLayoutColumn createDDMFormLayoutColumn( int size, String... fieldNames) { DDMFormLayoutColumn ddmFormLayoutColumn = new DDMFormLayoutColumn( size, fieldNames); return ddmFormLayoutColumn; } protected List<DDMFormLayoutColumn> createDDMFormLayoutColumns( String... fieldNames) { List<DDMFormLayoutColumn> ddmFormLayoutColumns = new ArrayList<>(); int size = 12 / fieldNames.length; for (String fieldName : fieldNames) { ddmFormLayoutColumns.add(new DDMFormLayoutColumn(size, fieldName)); } return ddmFormLayoutColumns; } protected DDMFormLayoutRow createDDMFormLayoutRow( DDMFormLayoutColumn... ddmFormLayoutColumns) { return createDDMFormLayoutRow(Arrays.asList(ddmFormLayoutColumns)); } protected DDMFormLayoutRow createDDMFormLayoutRow( List<DDMFormLayoutColumn> ddmFormLayoutColumns) { DDMFormLayoutRow ddmFormLayoutRow = new DDMFormLayoutRow(); ddmFormLayoutRow.setDDMFormLayoutColumns(ddmFormLayoutColumns); return ddmFormLayoutRow; } protected DDMFormValues createDDMFormValues(DDMForm ddmForm) { return createDDMFormValues( ddmForm, createAvailableLocales(LocaleUtil.US), LocaleUtil.US); } protected DDMFormValues createDDMFormValues( DDMForm ddmForm, Set<Locale> availableLocales, Locale defaultLocale) { DDMFormValues ddmFormValues = new DDMFormValues(ddmForm); ddmFormValues.setAvailableLocales(availableLocales); ddmFormValues.setDefaultLocale(defaultLocale); return ddmFormValues; } protected Document createDocument(String... fieldNames) { Document document = createEmptyDocument(); for (String fieldName : fieldNames) { addTextElement( document.getRootElement(), fieldName, fieldName, false); } return document; } protected Document createEmptyDocument() { Document document = SAXReaderUtil.createDocument(); Element rootElement = document.addElement("root"); rootElement.addAttribute("available-locales", "en_US"); rootElement.addAttribute("default-locale", "en_US"); return document; } protected Field createField( long ddmStructureId, String fieldName, List<Serializable> enValues, List<Serializable> ptValues) { Map<Locale, List<Serializable>> valuesMap = createValuesMap( enValues, ptValues); return new MockField( ddmStructureId, fieldName, valuesMap, LocaleUtil.US); } protected Fields createFields(Field... fieldsArray) { Fields fields = new Fields(); for (Field field : fieldsArray) { fields.put(field); } return fields; } protected Field createFieldsDisplayField( long ddmStructureId, String value) { Field fieldsDisplayField = new MockField( ddmStructureId, DDMImpl.FIELDS_DISPLAY_NAME, createValuesList(value), LocaleUtil.US); fieldsDisplayField.setDefaultLocale(LocaleUtil.US); return fieldsDisplayField; } protected Value createLocalizedValue( String enValue, String ptValue, Locale defaultLocale) { Value value = new LocalizedValue(defaultLocale); value.addString(LocaleUtil.BRAZIL, ptValue); value.addString(LocaleUtil.US, enValue); return value; } protected DDMFormField createParagraphDDMFormField(String name) { DDMFormField ddmFormField = new DDMFormField(name, "paragraph"); ddmFormField.setLocalizable(false); ddmFormField.setRepeatable(false); ddmFormField.setRequired(false); LocalizedValue localizedValue = ddmFormField.getLabel(); localizedValue.addString(LocaleUtil.US, name); return ddmFormField; } protected Document createSampleDocument() { Document document = createEmptyDocument(); addTextElement( document.getRootElement(), "Unlocalizable", "Text 2", false); return document; } protected DDMFormField createSeparatorDDMFormField( String name, boolean repeatable) { DDMFormField ddmFormField = new DDMFormField(name, "separator"); ddmFormField.setRepeatable(repeatable); LocalizedValue localizedValue = ddmFormField.getLabel(); localizedValue.addString(LocaleUtil.US, name); return ddmFormField; } protected DDMStructure createStructure(String name, DDMForm ddmForm) { return createStructure(name, ddmFormJSONSerializer.serialize(ddmForm)); } protected DDMStructure createStructure(String name, String definition) { DDMStructure structure = new DDMStructureImpl(); structure.setStructureId(RandomTestUtil.randomLong()); structure.setName(name); structure.setDefinition(definition); structures.put(structure.getStructureId(), structure); return structure; } protected DDMStructure createStructure(String name, String... fieldNames) { DDMForm ddmForm = createDDMForm(fieldNames); return createStructure(name, ddmForm); } protected DDMTemplate createTemplate( long templateId, String name, String mode, String script) { DDMTemplate template = new DDMTemplateImpl(); template.setTemplateId(templateId); template.setName(name); template.setMode(mode); template.setScript(script); templates.put(template.getTemplateId(), template); return template; } protected DDMFormField createTextDDMFormField(String name) { return createTextDDMFormField(name, name, true, false, false); } protected DDMFormField createTextDDMFormField( String name, String label, boolean localizable, boolean repeatable, boolean required) { DDMFormField ddmFormField = new DDMFormField(name, "text"); ddmFormField.setDataType("string"); ddmFormField.setLocalizable(localizable); ddmFormField.setRepeatable(repeatable); ddmFormField.setRequired(required); LocalizedValue localizedValue = ddmFormField.getLabel(); localizedValue.addString(LocaleUtil.US, label); return ddmFormField; } protected List<Serializable> createValuesList(String... valuesString) { List<Serializable> values = new ArrayList<>(); for (String valueString : valuesString) { values.add(valueString); } return values; } protected Map<Locale, List<Serializable>> createValuesMap( List<Serializable> enValues, List<Serializable> ptValues) { Map<Locale, List<Serializable>> valuesMap = new HashMap<>(); if (enValues != null) { valuesMap.put(LocaleUtil.US, enValues); } if (ptValues != null) { valuesMap.put(LocaleUtil.BRAZIL, ptValues); } return valuesMap; } protected DDMFormFieldTypeServicesTracker getMockedDDMFormFieldTypeServicesTracker() { setUpDefaultDDMFormFieldType(); DDMFormFieldTypeServicesTracker ddmFormFieldTypeServicesTracker = mock( DDMFormFieldTypeServicesTracker.class); DDMFormFieldRenderer ddmFormFieldRenderer = mock( DDMFormFieldRenderer.class); when( ddmFormFieldTypeServicesTracker.getDDMFormFieldRenderer( Matchers.anyString()) ).thenReturn( ddmFormFieldRenderer ); when( ddmFormFieldTypeServicesTracker.getDDMFormFieldType( Matchers.anyString()) ).thenReturn( _defaultDDMFormFieldType ); Map<String, Object> properties = new HashMap<>(); properties.put("ddm.form.field.type.icon", "my-icon"); properties.put( "ddm.form.field.type.js.class.name", "myJavaScriptClass"); properties.put("ddm.form.field.type.js.module", "myJavaScriptModule"); when( ddmFormFieldTypeServicesTracker.getDDMFormFieldTypeProperties( Matchers.anyString()) ).thenReturn( properties ); return ddmFormFieldTypeServicesTracker; } protected DDMStructure getStructure(long structureId) { try { return DDMStructureLocalServiceUtil.getStructure(structureId); } catch (Exception e) { return null; } } protected DDMForm getStructureDDMForm(DDMStructure structure) { try { return DDMStructureLocalServiceUtil.getStructureDDMForm(structure); } catch (Exception e) { return null; } } protected DDMTemplate getTemplate(long templateId) { try { return DDMTemplateLocalServiceUtil.getTemplate(templateId); } catch (Exception e) { return null; } } protected String read(String fileName) throws IOException { Class<?> clazz = getClass(); InputStream inputStream = clazz.getResourceAsStream( "dependencies/" + fileName); return StringUtil.read(inputStream); } protected void setUpConfigurationFactoryUtil() { mockStatic(ConfigurationFactoryUtil.class); when( _configurationFactory.getConfiguration( Matchers.any(ClassLoader.class), Matchers.anyString()) ).thenReturn( _configuration ); ConfigurationFactoryUtil.setConfigurationFactory(_configurationFactory); } protected void setUpDDMFormJSONDeserializer() throws Exception { // DDM form field type services tracker java.lang.reflect.Field field = ReflectionUtil.getDeclaredField( DDMFormJSONDeserializerImpl.class, "_ddmFormFieldTypeServicesTracker"); field.set( ddmFormJSONDeserializer, getMockedDDMFormFieldTypeServicesTracker()); // JSON factory field = ReflectionUtil.getDeclaredField( DDMFormJSONDeserializerImpl.class, "_jsonFactory"); field.set(ddmFormJSONDeserializer, new JSONFactoryImpl()); } protected void setUpDDMFormJSONSerializer() throws Exception { // DDM form field type services tracker java.lang.reflect.Field field = ReflectionUtil.getDeclaredField( DDMFormJSONSerializerImpl.class, "_ddmFormFieldTypeServicesTracker"); field.set( ddmFormJSONSerializer, getMockedDDMFormFieldTypeServicesTracker()); // JSON factory field = ReflectionUtil.getDeclaredField( DDMFormJSONSerializerImpl.class, "_jsonFactory"); field.set(ddmFormJSONSerializer, new JSONFactoryImpl()); } protected void setUpDDMStructureLocalServiceUtil() { mockStatic(DDMStructureLocalServiceUtil.class); when( getStructure(Matchers.anyLong()) ).then( new Answer<DDMStructure>() { @Override public DDMStructure answer(InvocationOnMock invocationOnMock) throws Throwable { Object[] args = invocationOnMock.getArguments(); Long structureId = (Long)args[0]; return structures.get(structureId); } } ); when( getStructureDDMForm(Matchers.any(DDMStructure.class)) ).then( new Answer<DDMForm>() { @Override public DDMForm answer(InvocationOnMock invocationOnMock) throws Throwable { Object[] args = invocationOnMock.getArguments(); DDMStructure structure = (DDMStructure)args[0]; return ddmFormJSONDeserializer.deserialize( structure.getDefinition()); } } ); } protected void setUpDDMTemplateLocalServiceUtil() { mockStatic(DDMTemplateLocalServiceUtil.class); when( getTemplate(Matchers.anyLong()) ).then( new Answer<DDMTemplate>() { @Override public DDMTemplate answer(InvocationOnMock invocationOnMock) throws Throwable { Object[] args = invocationOnMock.getArguments(); Long templateId = (Long)args[0]; return templates.get(templateId); } } ); } protected void setUpDefaultDDMFormFieldType() { when( _defaultDDMFormFieldType.getDDMFormFieldTypeSettings() ).then( new Answer<Class<? extends DDMFormFieldTypeSettings>>() { @Override public Class<? extends DDMFormFieldTypeSettings> answer( InvocationOnMock invocationOnMock) throws Throwable { return DDMFormFieldTypeSettingsTestUtil.getSettings(); } } ); } protected void setUpHtmlUtil() { HtmlUtil htmlUtil = new HtmlUtil(); htmlUtil.setHtml(new HtmlImpl()); } protected void setUpJSONFactoryUtil() { JSONFactoryUtil jsonFactoryUtil = new JSONFactoryUtil(); jsonFactoryUtil.setJSONFactory(new JSONFactoryImpl()); } protected void setUpLanguageUtil() { Set<Locale> availableLocales = SetUtil.fromArray( new Locale[] {LocaleUtil.BRAZIL, LocaleUtil.SPAIN, LocaleUtil.US}); whenLanguageGetAvailableLocalesThen(availableLocales); whenLanguageGet(LocaleUtil.BRAZIL, "no", "Não"); whenLanguageGet(LocaleUtil.BRAZIL, "yes", "Sim"); whenLanguageGet(LocaleUtil.SPAIN, "latitude", "Latitud"); whenLanguageGet(LocaleUtil.SPAIN, "longitude", "Longitud"); whenLanguageGet(LocaleUtil.US, "latitude", "Latitude"); whenLanguageGet(LocaleUtil.US, "longitude", "Longitude"); whenLanguageGet(LocaleUtil.US, "no", "No"); whenLanguageGet(LocaleUtil.US, "yes", "Yes"); whenLanguageGetLanguageId(LocaleUtil.BRAZIL, "pt_BR"); whenLanguageGetLanguageId(LocaleUtil.SPAIN, "es_ES"); whenLanguageGetLanguageId(LocaleUtil.US, "en_US"); whenLanguageIsAvailableLocale("en_US"); whenLanguageIsAvailableLocale("es_ES"); whenLanguageIsAvailableLocale("pt_BR"); whenLanguageIsAvailableLocale(LocaleUtil.BRAZIL); whenLanguageIsAvailableLocale(LocaleUtil.SPAIN); whenLanguageIsAvailableLocale(LocaleUtil.US); LanguageUtil languageUtil = new LanguageUtil(); languageUtil.setLanguage(language); } protected void setUpLocaleUtil() { mockStatic(LocaleUtil.class); when( LocaleUtil.fromLanguageId("en_US") ).thenReturn( LocaleUtil.US ); when( LocaleUtil.fromLanguageId("pt_BR") ).thenReturn( LocaleUtil.BRAZIL ); when( LocaleUtil.getDefault() ).thenReturn( LocaleUtil.US ); when( LocaleUtil.toLanguageId(LocaleUtil.US) ).thenReturn( "en_US" ); when( LocaleUtil.toLanguageId(LocaleUtil.BRAZIL) ).thenReturn( "pt_BR" ); when( LocaleUtil.toLanguageIds((Locale[])Matchers.any()) ).then( new Answer<String[]>() { @Override public String[] answer(InvocationOnMock invocationOnMock) throws Throwable { Object[] args = invocationOnMock.getArguments(); Locale[] locales = (Locale[])args[0]; String[] languageIds = new String[locales.length]; for (int i = 0; i < locales.length; i++) { languageIds[i] = LocaleUtil.toLanguageId(locales[i]); } return languageIds; } } ); } protected void setUpLocalizationUtil() { spy(LocalizationUtil.class); when( LocalizationUtil.getLocalization() ).thenReturn( new LocalizationImpl() ); } protected void setUpPortalClassLoaderUtil() { mockStatic(PortalClassLoaderUtil.class); when( PortalClassLoaderUtil.getClassLoader() ).thenReturn( _classLoader ); } protected void setUpPropsValues() { mockStatic(PropsValues.class); } protected void setUpResourceBundleUtil() { mockStatic(ResourceBundleUtil.class); when( ResourceBundleUtil.getBundle( "content.Language", LocaleUtil.BRAZIL, _classLoader) ).thenReturn( _resourceBundle ); when( ResourceBundleUtil.getBundle( "content.Language", LocaleUtil.US, _classLoader) ).thenReturn( _resourceBundle ); } protected void setUpSAXReaderUtil() { SAXReaderUtil saxReaderUtil = new SAXReaderUtil(); SAXReaderImpl secureSAXReader = new SAXReaderImpl(); secureSAXReader.setSecure(true); saxReaderUtil.setSAXReader(secureSAXReader); UnsecureSAXReaderUtil unsecureSAXReaderUtil = new UnsecureSAXReaderUtil(); SAXReaderImpl unsecureSAXReader = new SAXReaderImpl(); unsecureSAXReaderUtil.setSAXReader(unsecureSAXReader); } protected void whenLanguageGet( Locale locale, String key, String returnValue) { when( language.get(Matchers.eq(locale), Matchers.eq(key)) ).thenReturn( returnValue ); } protected void whenLanguageGetAvailableLocalesThen( Set<Locale> availableLocales) { when( language.getAvailableLocales() ).thenReturn( availableLocales ); } protected void whenLanguageGetLanguageId(Locale locale, String languageId) { when( language.getLanguageId(Matchers.eq(locale)) ).thenReturn( languageId ); } protected void whenLanguageIsAvailableLocale(Locale locale) { when( language.isAvailableLocale(Matchers.eq(locale)) ).thenReturn( true ); } protected void whenLanguageIsAvailableLocale(String languageId) { when( language.isAvailableLocale(Matchers.eq(languageId)) ).thenReturn( true ); } protected final DDMFormJSONDeserializer ddmFormJSONDeserializer = new DDMFormJSONDeserializerImpl(); protected final DDMFormJSONSerializer ddmFormJSONSerializer = new DDMFormJSONSerializerImpl(); @Mock protected Language language; protected Map<Long, DDMStructure> structures = new HashMap<>(); protected Map<Long, DDMTemplate> templates = new HashMap<>(); protected class MockField extends Field { public MockField( long ddmStructureId, String name, List<Serializable> values, Locale locale) { super(ddmStructureId, name, values, locale); } public MockField( long ddmStructureId, String name, Map<Locale, List<Serializable>> valuesMap, Locale defaultLocale) { super(ddmStructureId, name, valuesMap, defaultLocale); } @Override public DDMStructure getDDMStructure() { return structures.get(getDDMStructureId()); } private static final long serialVersionUID = 1L; } @Mock private ClassLoader _classLoader; @Mock private Configuration _configuration; @Mock private ConfigurationFactory _configurationFactory; @Mock private DDMFormFieldType _defaultDDMFormFieldType; @Mock private ResourceBundle _resourceBundle; }