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
Antwort
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);
}
}
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.
Ü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 –