Search the FirstSpirit Knowledge Base
Guten Morgen zusammen,
ich habe derzeit ein Problem, meinen Unit-Test abzuschließen.
Folgende Situation:
Meine Businesslogik holt sich einen Wert aus einem FormData-Objekt und schubst dieses in ein anderes hinein (vgl. Syncer).
Wie kann ich die "*.set(...)" Methode dynamisch in meinem JUnit-Test integrieren?
Es macht ja wenig Sinn, á la when(formfield.get()).thenReturn(object) des Ziel-FormData Objektes abzufangen.
Viele Grüße
Marcel
P.S.: Das Mock-Framework von diva-e ist leider keine Lösung, da wir noch Java 7 im Einsatz haben :smileyshocked: :smileycry:
Hallo Marcel,
danke, dass hat es viel klarer für mich gemacht
Persönlich würde ich in diesem Fall tatsächlich die oben erwähnte verify Methode nutzen. Mit der kannst du prüfen, ob auf countryPageRefFooterFormField die set-Methode aufgerufen wurde und ob der Parameter datasetContainer1 war. Ein assertEquals-Ansatz läuft hier imho immer darauf hinaus, dass du testest, ob du richtig gemockt hast, weil countryPageRefFooterFormField ein Mock ist, dem du manuell beibringen musst, was er beim get-Aufruf zurückliefern soll.
Mockito hat zwar eine thenCallRealMethod-Methode, die das Problem beheben könnte, aber das funktioniert hier nicht, weil du FormData mockst, was nur ein Interface ist. Es gibt also keine "real method".
Aber vielleicht hat jemand anderes noch eine schlaue Idee.
Viele Grüße
Tim
Hallo Marcel,
was genau möchtest du denn testen? Dass der Wert über die set-Methode geschrieben wird? Dann wäre mein Vorschlag z. B. die verify Methode von Mockito zu verwenden: https://static.javadoc.io/org.mockito/mockito-core/2.18.0/org/mockito/Mockito.html#1
Viele Grüße
Tim
Hi Tim,
ein gemocktes Objekt wird in der Business-Logik mit einem Variablen Wert befüllt.
Impl
FormData formData1 = bla.getFormData();
FormData formData2 = blub.getFormData();
FormField<DatasetContainer> value1 = formData1.get(null, "ident");
FormField<DatasetContainer> value2 = formData2.get(null, "ident");
DatasetContainer datasetContainer = value1.get();
value2.set(datasetContainer);
formData2.setFormData(formData2);
Hier in der Zeile 9 fliegt dann eine NPE.
Viele Grüße
Marcel
Hallo Marcel,
sorry, ich glaube ich brauche da einfach etwas mehr Kontext :smileygrin:
Die NPE fliegt, weil value2 null ist? Welche Objekte sind in dem Schnipsel gemockt? Was soll der Test fachlich überprüfen (davon hängt ja auch das Mocking ab)? Könntest du vielleicht auch den Test inkl. des Mockings hier posten?
Viele Grüße
Tim
Hi Tim,
nein value2 ist nicht null.
Gemockt sind alle Objekte - jedoch mock ich die Methode ja nicht. Würde ich das machen, so verfälsche ich ja meinen Test.
Hier ein Auszug aus der Impl:
FormData sourceMetaFormData = sourceElement.getMetaFormData();
FormData targetMetaFormData = targetElement.getMetaFormData();
DatasetContainer sourceFooterDataset = (DatasetContainer) sourceMetaFormData.get(null, INPUT_FOOTER).get();
DatasetContainer sourceFooterLinksDataset = (DatasetContainer) sourceMetaFormData.get(null, INPUT_FOOTER_LINKS).get();
DatasetContainer sourceFooterSocialMediaSetDataset = (DatasetContainer) sourceMetaFormData.get(null, INPUT_SOCIAL_MEDIA_SET).get();
DatasetContainer sourceHeaderDataset = (DatasetContainer) sourceMetaFormData.get(null, INPUT_HEADER).get();
FormField<?> targetFooterField = targetMetaFormData.get(null, INPUT_FOOTER);
FormField<?> targetFooterLinksField = targetMetaFormData.get(null, INPUT_FOOTER_LINKS);
FormField<?> targetFooterSocialMediaSetField = targetMetaFormData.get(null, INPUT_SOCIAL_MEDIA_SET);
FormField<?> targetHeaderField = targetMetaFormData.get(null, INPUT_HEADER);
targetFooterField.set(sourceFooterDataset);
targetFooterLinksField.set(sourceFooterLinksDataset);
targetFooterSocialMediaSetField.set(sourceFooterSocialMediaSetDataset);
targetHeaderField.set(sourceHeaderDataset);
try{
targetElement.setLock(true, false);
targetElement.setMetaFormData(targetMetaFormData);
targetElement.save("Synced meta data from source project");
// ...
}catch(
catch (LockException | ElementDeletedException e) {
log.error(e.getMessage(), e);
}
Hier der Test
Project wing = mock(Project.class);
UserService wingUserService = mock(UserService.class);
Project country = mock(Project.class);
UserService countryUserService = mock(UserService.class);
DatasetContainer datasetContainer1 = mock(DatasetContainer.class);
DatasetContainer datasetContainer2 = mock(DatasetContainer.class);
DatasetContainer datasetContainer3 = mock(DatasetContainer.class);
DatasetContainer datasetContainer4 = mock(DatasetContainer.class);
Subscription subscription = mock(Subscription.class);
IdTranslator idTranslator = mock(IdTranslator.class);
when(subscription.getElementIdTranslator()).thenReturn(idTranslator);
// WING
SiteStoreRoot wingSiteStoreRoot = mock(SiteStoreRoot.class);
PageRef wingPageRef = mock(PageRef.class);
FormData wingPageRefFormData = mock(FormData.class);
FormField wingPageRefFooterFormField = mock(FormField.class);
FormField wingPageRefFooterLinksFormField = mock(FormField.class);
FormField wingPageRefFooterSocialMediaFormField = mock(FormField.class);
FormField wingPageRefHeaderFormField = mock(FormField.class);
PageRefFolder wingPageRefFolder = mock(PageRefFolder.class);
FormData wingPageRefFolderFormData = mock(FormData.class);
FormField wingPageRefFolderFooterFormField = mock(FormField.class);
FormField wingPageRefFolderFooterLinksFormField = mock(FormField.class);
FormField wingPageRefFolderFooterSocialMediaFormField = mock(FormField.class);
FormField wingPageRefFolderHeaderFormField = mock(FormField.class);
when(wingPageRef.hasUid()).thenReturn(true);
when(wingPageRef.isSubscribedItem()).thenReturn(true);
when(wingPageRef.getMetaFormData()).thenReturn(wingPageRefFormData);
when(wingPageRef.getLongID()).thenReturn(1L);
when(wingPageRefFolder.hasUid()).thenReturn(true);
when(wingPageRefFolder.isSubscribedItem()).thenReturn(true);
when(wingPageRefFolder.getMetaFormData()).thenReturn(wingPageRefFolderFormData);
when(wingPageRefFolder.getLongID()).thenReturn(2L);
when(wingPageRefFormData.get(null, INPUT_FOOTER)).thenReturn(wingPageRefFooterFormField);
when(wingPageRefFormData.get(null, INPUT_FOOTER_LINKS)).thenReturn(wingPageRefFooterLinksFormField);
when(wingPageRefFormData.get(null, INPUT_SOCIAL_MEDIA_SET)).thenReturn(wingPageRefFooterSocialMediaFormField);
when(wingPageRefFormData.get(null, INPUT_HEADER)).thenReturn(wingPageRefHeaderFormField);
when(wingPageRefFolderFormData.get(null, INPUT_FOOTER)).thenReturn(wingPageRefFolderFooterFormField);
when(wingPageRefFolderFormData.get(null, INPUT_FOOTER_LINKS)).thenReturn(wingPageRefFolderFooterLinksFormField);
when(wingPageRefFolderFormData.get(null, INPUT_SOCIAL_MEDIA_SET)).thenReturn(wingPageRefFolderFooterSocialMediaFormField);
when(wingPageRefFolderFormData.get(null, INPUT_HEADER)).thenReturn(wingPageRefFolderHeaderFormField);
when(wingPageRefFooterFormField.get()).thenReturn(datasetContainer1);
when(wingPageRefFooterLinksFormField.get()).thenReturn(datasetContainer2);
when(wingPageRefFooterSocialMediaFormField.get()).thenReturn(datasetContainer3);
when(wingPageRefHeaderFormField.get()).thenReturn(datasetContainer4);
when(wingPageRefFolderFooterFormField.get()).thenReturn(datasetContainer4);
when(wingPageRefFolderFooterLinksFormField.get()).thenReturn(datasetContainer3);
when(wingPageRefFolderFooterSocialMediaFormField.get()).thenReturn(datasetContainer2);
when(wingPageRefFolderHeaderFormField.get()).thenReturn(datasetContainer1);
when(wingPageRef.getUid()).thenReturn("page-ref");
when(wingPageRefFolder.getUid()).thenReturn("page-ref-folder");
when(wing.getUserService()).thenReturn(wingUserService);
when(wingUserService.getStore(Store.Type.SITESTORE, true)).thenReturn(wingSiteStoreRoot);
// Country
SiteStoreRoot countrySiteStoreRoot = mock(SiteStoreRoot.class);
PageRef countryPageRef = mock(PageRef.class);
FormData countryPageRefFormData = mock(FormData.class);
FormField countryPageRefFooterFormField = mock(FormField.class);
FormField countryPageRefFooterLinksFormField = mock(FormField.class);
FormField countryPageRefFooterSocialMediaFormField = mock(FormField.class);
FormField countryPageRefHeaderFormField = mock(FormField.class);
List<PageRef> countryPageRefs = Arrays.asList(countryPageRef);
PageRefFolder countryPageRefFolder = mock(PageRefFolder.class);
FormData countryPageRefFolderFormData = mock(FormData.class);
FormField countryPageRefFolderFormField = mock(FormField.class);
FormField countryPageRefFolderLinksFormField = mock(FormField.class);
FormField countryPageRefFolderSocialMediaFormField = mock(FormField.class);
FormField countryPageRefFolderHeaderFormField = mock(FormField.class);
List<PageRefFolder> countryPageRefFolders = Arrays.asList(countryPageRefFolder);
when(countryPageRef.hasUid()).thenReturn(true);
when(countryPageRef.isSubscribedItem()).thenReturn(true);
when(countryPageRef.getLongID()).thenReturn(1L);
when(countryPageRefFolder.hasUid()).thenReturn(true);
when(countryPageRefFolder.isSubscribedItem()).thenReturn(true);
when(countryPageRefFolder.getLongID()).thenReturn(2L);
when(countryPageRef.getUid()).thenReturn("page-ref");
when(countryPageRef.getMetaFormData()).thenReturn(countryPageRefFormData);
when(countryPageRefFolder.getUid()).thenReturn("page-ref-folder");
when(countryPageRefFolder.getMetaFormData()).thenReturn(countryPageRefFolderFormData);
when(idTranslator.translateIdToPublisher(countryPageRef.getLongID())).thenReturn(1L);
when(wingSiteStoreRoot.getStoreElement(countryPageRef.getLongID())).thenReturn(wingPageRef);
when(idTranslator.translateIdToPublisher(countryPageRefFolder.getLongID())).thenReturn(2L);
when(wingSiteStoreRoot.getStoreElement(countryPageRefFolder.getLongID())).thenReturn(wingPageRefFolder);
when(countryPageRefFormData.get(null, INPUT_FOOTER)).thenReturn(countryPageRefFooterFormField);
when(countryPageRefFormData.get(null, INPUT_FOOTER_LINKS)).thenReturn(countryPageRefFooterLinksFormField);
when(countryPageRefFormData.get(null, INPUT_SOCIAL_MEDIA_SET)).thenReturn(countryPageRefFooterSocialMediaFormField);
when(countryPageRefFormData.get(null, INPUT_HEADER)).thenReturn(countryPageRefHeaderFormField);
when(countryPageRefFolderFormData.get(null, INPUT_FOOTER)).thenReturn(countryPageRefFolderFormField);
when(countryPageRefFolderFormData.get(null, INPUT_FOOTER_LINKS)).thenReturn(countryPageRefFolderLinksFormField);
when(countryPageRefFolderFormData.get(null, INPUT_SOCIAL_MEDIA_SET)).thenReturn(countryPageRefFolderSocialMediaFormField);
when(countryPageRefFolderFormData.get(null, INPUT_HEADER)).thenReturn(countryPageRefFolderHeaderFormField);
when(country.getUserService()).thenReturn(countryUserService);
when(countryUserService.getStore(Store.Type.SITESTORE, false)).thenReturn(countrySiteStoreRoot);
when(countrySiteStoreRoot.getChildren(PageRef.class, true)).thenReturn(new MockPageRefListable(countryPageRefs));
when(countrySiteStoreRoot.getChildren(PageRefFolder.class, true)).thenReturn(new MockPageRefFolderListable(countryPageRefFolders));
MetaDataSyncer.syncMetaData(subscription, wing, country);
Erwarten würde ich z.B. folgendes:
assertEquals(datasetContainer1, countryPageRefFooterFormField.get());
Viele Grüße
Marcel
Hallo Marcel,
danke, dass hat es viel klarer für mich gemacht
Persönlich würde ich in diesem Fall tatsächlich die oben erwähnte verify Methode nutzen. Mit der kannst du prüfen, ob auf countryPageRefFooterFormField die set-Methode aufgerufen wurde und ob der Parameter datasetContainer1 war. Ein assertEquals-Ansatz läuft hier imho immer darauf hinaus, dass du testest, ob du richtig gemockt hast, weil countryPageRefFooterFormField ein Mock ist, dem du manuell beibringen musst, was er beim get-Aufruf zurückliefern soll.
Mockito hat zwar eine thenCallRealMethod-Methode, die das Problem beheben könnte, aber das funktioniert hier nicht, weil du FormData mockst, was nur ein Interface ist. Es gibt also keine "real method".
Aber vielleicht hat jemand anderes noch eine schlaue Idee.
Viele Grüße
Tim