MarsDD
Occasional Observer

Unit-Test mit FormField Objekten

Jump to solution

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: Smiley Sad

0 Kudos
1 Solution

Accepted Solutions

Hallo Marcel,

danke, dass hat es viel klarer für mich gemacht Smiley Happy

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

View solution in original post

0 Kudos
5 Replies
pavone
I'm new here

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

0 Kudos
MarsDD
Occasional Observer

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

0 Kudos

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

0 Kudos
MarsDD
Occasional Observer

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

0 Kudos

Hallo Marcel,

danke, dass hat es viel klarer für mich gemacht Smiley Happy

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

0 Kudos