Мне нужно написать примеры тестов JUnit для классов Java, которые используются для бизнес-логики и взаимодействуют с AEM. Я не нашел подходящего документа для написания тестовых примеров JUnit. Если у вас есть такой документ, попросите вас поделиться со мной.Как написать тестовые примеры Junit для Java-класса в AEM6.2
ответ
Не знаете, что вы ищете здесь. Тесты Junit для классов AEM не отличаются от того, что вы пишете о любом классе Java. Если понадобится, вам может понадобиться фальшивая инфраструктура для Mock Sling.
Подробность вокруг насмешливых для OSGi и строп классов описаны на апач сайте стропа here с кодом образца в here
образца WCMUsePojo класс -
public class DisplayAsDataSourceWcmUse extends WCMUsePojo {
/**
* Display as script regex.
*/
private static final String DISPLAY_AS_REGEX_EXPR = "^displayAs\\_(.*)\\.html$";
/**
* Datasource to the display listing.
*/
private DataSource dataSource;
/**
* activate method.
*
* @throws Exception
*/
@SuppressWarnings("PMD.SignatureDeclareThrowsException")
@Override
public final void activate() throws Exception {
this.buildDisplayAsOptions();
}
/**
* Build the list of views for the DisplayAs Option.
*/
private void buildDisplayAsOptions() {
final SlingHttpServletRequest request = getRequest();
final Resource componentResource = getCurrentComponent();
List<Resource> resourceList = Collections.emptyList();
if (null != componentResource) {
final Iterable<Resource> children =() -> componentResource.listChildren();
final Stream<Resource> childResourceStream = StreamSupport.stream(children.spliterator(), false);
resourceList = childResourceStream
.filter(resource -> resource
.getName().matches(DISPLAY_AS_REGEX_EXPR))
.map(this::getMappedResource)
.collect(Collectors.toList());
childResourceStream.close();
}
if (resourceList.isEmpty()) {
dataSource = EmptyDataSource.instance();
} else {
dataSource = new SimpleDataSource(resourceList.iterator());
}
// place it in request for consumption by datasource mechanism
request.setAttribute(DataSource.class.getName(), dataSource);
}
/**
* Get resource instance of current component i.e. resource with path to component under apps/.
*
* @return component resource.
*/
private Resource getCurrentComponent() {
final Resource listResource = getResourceResolver().getResource((String) getRequest().getAttribute(Value
.CONTENTPATH_ATTRIBUTE));
if (listResource != null) {
return getResourceResolver().getResource(listResource.getResourceType());
}
return null;
}
/**
* Get Mapped Synthetic resource corresponding to the Display View.
*
* @param resource - Resource instance of display script.
* @return ValueMapResource transformation of display script.
*/
@SuppressWarnings("unused")
private ValueMapResource getMappedResource(final Resource resource) {
final String value = resource.getName().replaceFirst(DISPLAY_AS_REGEX_EXPR, "$1");
// see if there's a better label
final String text = ResourceUtil.getValueMap(resource).get(JcrConstants.JCR_TITLE, value);
// create a ValueMap
final Map<String, Object> map = new HashMap();
map.put("text", text);
map.put("value", value);
// return a synthetic resource
return new ValueMapResource(getResourceResolver(), new ResourceMetadata(), "", new ValueMapDecorator(map));
}
/**
* Getter for dataSource.
*
* @return Datasource.
*/
public final DataSource getDataSource() {
return dataSource;
}
}
Один из возможных способов испытания блока с использованием Mockito (не очень идеальный способ, так как вы заканчиваете писать много издевок, в таких случаях лучше всего подходят тесты интеграции) -
@RunWith(MockitoJUnitRunner.class)
public class DisplayAsDataSourceWcmUseTest {
@Mock
private Bindings bindings;
@Mock
private Resource currentResource;
@Mock
private Resource componentResource;
@Mock
private ResourceResolver resourceResolver;
@Mock
private SlingHttpServletRequest request;
@Mock
private Iterator<Resource> childItr;
@Mock
private Resource displayAsOne;
@Mock
private Resource displayAsTwo;
@InjectMocks
private DisplayAsDataSourceWcmUse displayAsDataSourceWcmUse;
@Before
public void setup() {
when(bindings.get("resource")).thenReturn(currentResource);
when(bindings.get("request")).thenReturn(request);
when(request.getResourceResolver()).thenReturn(resourceResolver);
when(request.getAttribute(Value.CONTENTPATH_ATTRIBUTE)).thenReturn("list/component/instance");
when(currentResource.getResourceType()).thenReturn("current/resource/type");
when(resourceResolver.getResource("current/resource/type")).thenReturn(componentResource);
when(resourceResolver.getResource("list/component/instance")).thenReturn(currentResource);
List<Resource> childRes = new ArrayList<>();
childRes.add(displayAsOne);
childRes.add(displayAsTwo);
when(componentResource.listChildren()).thenReturn(childRes.iterator());
when(displayAsOne.getName()).thenReturn("displayAs_One.html");
when(displayAsTwo.getName()).thenReturn("displayAs_Two.html");
Map<String, Object> vm1 = new HashMap();
vm1.put(JcrConstants.JCR_TITLE, "Display Type One");
when(displayAsOne.getValueMap()).thenReturn(new ValueMapDecorator(vm1));
when(displayAsTwo.getValueMap()).thenReturn(new ValueMapDecorator(new HashMap()));
}
@Test
public void test_display_option_are_set() throws Exception{
displayAsDataSourceWcmUse = new DisplayAsDataSourceWcmUse();
displayAsDataSourceWcmUse.init(bindings);
assertTrue(displayAsDataSourceWcmUse.getDataSource() instanceof SimpleDataSource);
}
@Test
public void test_empty_datasource_is_set() throws Exception{
List<Resource> childRes = new ArrayList<>();
when(componentResource.listChildren()).thenReturn(childRes.iterator());
displayAsDataSourceWcmUse = new DisplayAsDataSourceWcmUse();
displayAsDataSourceWcmUse.init(bindings);
assertTrue(displayAsDataSourceWcmUse.getDataSource() instanceof EmptyDataSource);
}
}
Посмотрите на 'ContiPerf 2'.
ContiPerf - это легкая утилита для тестирования, которая позволяет пользователю легко использовать тестовые примеры JUnit 4 в качестве тестов производительности, например. для непрерывного тестирования производительности. Он вдохновлен JUnit 4 в простой тестовой конфигурации с аннотациями и идеей JUnitPerf в оберточном модульные тесты для тестирования производительности, но более мощные и простой в использовании:
- Использование Java аннотаций для определения тестового выполнения characterisitics и требований к производительности.
- Вы можете отметить тест для запуска определенное количество раз или многократное выполнение в течение определенного периода времени.
- Требования к характеристикам могут быть максимальными, средними, средними или любыми периодами времени, затрачиваемыми процентилями.
- Отличное управление и удобочитаемость требований к производительности. Вы можете запускать тесты в двух разных режимах, используя их в качестве простых модульных тестов или тестов производительности.
- Простая интеграция с Eclipse и Maven.
- Экспорт резюме выполнения в файл CSV.
- Малая библиотека без внешних зависимостей (только JUnit).
- Простое расширение с помощью пользовательской статистики и механизмов отслеживания.
Проверьте эту ссылку, очень полезную для новичков: http://www.wemblog.com/2016/12/how-to-write-tests-in-aem.html –