Aller au contenu principal

Unit-Test mit FormField Objekten

Commentaires

5 commentaires

  • Zendesk API User
    Author: pavone - 4/19/2018 10:11

    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
  • Zendesk API User
    Author: MarsDD - 4/19/2018 10:20

    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
  • Zendesk API User
    Author: pavone - 4/19/2018 11:01

    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
  • Zendesk API User
    Author: MarsDD - 4/19/2018 11:23

    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
  • Zendesk API User
    Author: pavone - 4/19/2018 12:08

    Hallo Marcel,

    danke, dass hat es viel klarer für mich gemacht :smileyhappy:

    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

Vous devez vous connecter pour laisser un commentaire.