2016-07-31 3 views
-2

Мне нужно написать примеры тестов JUnit для классов Java, которые используются для бизнес-логики и взаимодействуют с AEM. Я не нашел подходящего документа для написания тестовых примеров JUnit. Если у вас есть такой документ, попросите вас поделиться со мной.Как написать тестовые примеры Junit для Java-класса в AEM6.2

+0

Проверьте эту ссылку, очень полезную для новичков: http://www.wemblog.com/2016/12/how-to-write-tests-in-aem.html –

ответ

0

Не знаете, что вы ищете здесь. Тесты 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); 
    } 

} 
0

Посмотрите на 'ContiPerf 2'.

ContiPerf - это легкая утилита для тестирования, которая позволяет пользователю легко использовать тестовые примеры JUnit 4 в качестве тестов производительности, например. для непрерывного тестирования производительности. Он вдохновлен JUnit 4 в простой тестовой конфигурации с аннотациями и идеей JUnitPerf в оберточном модульные тесты для тестирования производительности, но более мощные и простой в использовании:

  • Использование Java аннотаций для определения тестового выполнения characterisitics и требований к производительности.
  • Вы можете отметить тест для запуска определенное количество раз или многократное выполнение в течение определенного периода времени.
  • Требования к характеристикам могут быть максимальными, средними, средними или любыми периодами времени, затрачиваемыми процентилями.
  • Отличное управление и удобочитаемость требований к производительности. Вы можете запускать тесты в двух разных режимах, используя их в качестве простых модульных тестов или тестов производительности.
  • Простая интеграция с Eclipse и Maven.
  • Экспорт резюме выполнения в файл CSV.
  • Малая библиотека без внешних зависимостей (только JUnit).
  • Простое расширение с помощью пользовательской статистики и механизмов отслеживания.