2016-07-31 23 views
-2

Ich muss JUnit Testfälle für Java-Klassen schreiben, die für Business-Logik verwendet werden und interagieren mit AEM. Ich finde nicht das richtige Dokument zum Schreiben von JUnit-Testfällen. Wenn Sie ein solches Dokument haben, bitten Sie mich, es mit mir zu teilen.Wie schreibe ich Junit Testfälle für Java-Klasse in AEM6.2

+0

Überprüfen Sie diesen Link, sehr nützlich für Anfänger: http://www.wemblog.com/2016/12/how-to-write-tests-in-aem.html –

Antwort

0

Nicht sicher, was Sie hier suchen. Die Junit-Testfälle für AEM-Klassen unterscheiden sich nicht von dem, was Sie von einer Java-Klasse schreiben. Möglicherweise benötigen Sie ein spöttisches Framework, um die Sling-Objekte zu verspotten.

Die Details um spöttische für OSGi und Schleuder-Klassen sind in here

Eine Probe WCMUsePojo Klasse auf Apache Sling Website here mit dem Beispielcode beschrieben -

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; 
    } 
} 

Einen möglichen Weg zur Einheit Test Mockito mit (nicht sehr ideal, da Sie am Ende viele Mocks schreiben, in solchen Fällen sind Integrationstests am besten geeignet) -

@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

Werfen Sie einen Blick auf 'ContiPerf 2'.

ContiPerf ist ein leichtgewichtiges Testprogramm, mit dem der Benutzer JUnit 4 Testfälle als Leistungstests, z. für kontinuierliche Leistungstests. Es zeichnet sich durch einfache Testkonfiguration JUnit 4 ist mit Anmerkungen inspiriert und von JUnitPerf Idee von Unit-Tests für Performance-Tests Einwickeln, aber leistungsfähige und einfacher zu bedienen:

  • Java-Annotationen Verwendung für die Definition der Testausführung CHARAKTERISTIKA und Leistungsanforderungen.
  • Sie können einen Test so markieren, dass er eine bestimmte Anzahl von Malen ausführt oder für eine bestimmte Zeit wiederholt ausgeführt wird.
  • Leistungsanforderungen können maximale, durchschnittliche, mittlere oder beliebige prozentuale Ausführungszeit sein.
  • Perfekte Kontrolle und Lesbarkeit der Leistungsanforderungen Sie können Tests in zwei verschiedenen Modi ausführen und sie als einfache Komponententests oder Leistungstests verwenden.
  • Einfache Integration mit Eclipse und Maven.
  • Export der Ausführungsübersicht in eine CSV-Datei.
  • Kleine Bibliothek ohne externe Abhängigkeiten (nur JUnit).
  • Einfache Erweiterung mit benutzerdefinierten statistischen Auswertungs- und Tracking-Mechanismen.