Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

An diesem einfachen Testfall kann man bereits erkennen, das er Aufruf der zu testenden Methode nur ein ganz kleiner Teil des Unit Testes ist. Den größten Teil eines Tests nimmt meist die Behandlung der Mock Objekte in Anspruch. Es ist daher notwendig, sich mit dem verwendeten Mock Framework gut auszukennen. 

DataFactory

Codeblock
languagejava
title/<extension-server>/src/test/java/de/fdm/server/explorer/PdmcaeExplorerFacadeBeanTest.java
package de.bmw.fdm.server.explorer;

import static de.fdm.common.FdmCommon.BO_Datenbedarf;
import static de.fdm.common.FdmCommon.BO_Datenpakettyp;
import static de.fdm.common.FdmCommon.BO_Fahrzeugbaum;
import static de.fdm.common.FdmCommon.BO_Knoten;
import static de.fdm.common.FdmCommon.F_Datenbedarf_fahrzeugbaum;
import static de.fdm.common.FdmCommon.F_Datenbedarf_link;
import static de.fdm.common.FdmCommon.F_Datenbedarf_modell;
import static de.fdm.common.FdmCommon.F_Datenbedarf_pfad;
import static de.fdm.common.FdmCommon.F_Datenbedarf_produktlinie;
import static de.fdm.common.FdmCommon.F_Datenbedarf_sachnummer;
import static de.fdm.common.FdmCommon.F_Datenpakettyp_bkrelevant;
import static de.fdm.common.FdmCommon.F_Datenpakettyp_knoten;
import static de.fdm.common.FdmCommon.F_Fahrzeugbaum_fahrzeug;
import static de.fdm.common.FdmCommon.F_Fahrzeugbaum_knotenname;
import static de.fdm.common.FdmCommon.F_Fahrzeugbaum_uebergeordnknoten;
import static de.fdm.common.FdmCommon.F_Knoten_bezeichnung;
import static de.fdm.common.FdmCommon.F_Knoten_uebergeordnknoten;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.apache.log4j.Logger;

import org.nuclos.common.UID;
import org.nuclos.common.UsageCriteria;
import org.nuclos.common.collection.Pair;
import org.nuclos.common.dal.vo.EntityObjectVO;
import org.nuclos.server.dal.DalSupportForGO;
import org.nuclos.server.genericobject.valueobject.GenericObjectVO;
import org.nuclos.server.masterdata.valueobject.MasterDataVO;
import org.nuclos.server.navigation.treenode.DefaultMasterDataTreeNode;
import org.nuclos.server.navigation.treenode.DefaultMasterDataTreeNodeParameters;
import org.nuclos.server.navigation.treenode.GenericObjectTreeNode.RelationDirection;
import org.nuclos.server.navigation.treenode.GenericObjectTreeNode.SystemRelationType;

import de.fdm.common.FdmCommon;
import de.fdm.common.explorer.FolderTreeNode;
import de.fdm.common.explorer.PdmcaeTreeNode;

class DataFactory {

    private static final Logger LOG = Logger.getLogger(DataFactory.class);
    
    //
    
    private final Random rand = new Random(9132278275L);
    
    DataFactory() {
    }
        
    EntityObjectVO<Long> finishEo(EntityObjectVO<Long> eo) {
        eo.setPrimaryKey(rand.nextLong());
        return eo;
    }
    
    GenericObjectVO getBO_KnotenAsGO(GenericObjectVO parent, String name) {
        return DalSupportForGO.getGenericObjectVOForUnitTest(getBO_Knoten(parent, name));
    }
        
    EntityObjectVO<Long> getBO_Knoten(GenericObjectVO parent, String name) {
        final EntityObjectVO<Long> eo = new EntityObjectVO<Long>(BO_Knoten);
        
        eo.setFieldValue(F_Knoten_bezeichnung, name + "Bez");
        if (parent != null) {
            eo.setFieldId(F_Knoten_uebergeordnknoten, parent.getPrimaryKey());
        } else {
            eo.setFieldId(F_Knoten_uebergeordnknoten, null);            
        }
        finishEo(eo);
        // final MasterDataVO<Long> der = new MasterDataVO<Long>(finishEo(eo));
        return eo;
    }
        
    MasterDataVO<Long> getBO_Datenpakettyp(GenericObjectVO parent, String name) {
        final EntityObjectVO<Long> eo = new EntityObjectVO<Long>(BO_Datenpakettyp);
        
        // BO_Knoten
        eo.setFieldValue(F_Knoten_bezeichnung, name + "Bez");
        if (parent != null) {
            eo.setFieldId(F_Datenpakettyp_knoten, parent.getPrimaryKey());
        } else {
            eo.setFieldId(F_Datenpakettyp_knoten, null);            
        }
        
        // BO_Datenpakettyp
        eo.setFieldValue(F_Datenpakettyp_bkrelevant, true);
        
        final MasterDataVO<Long> der = new MasterDataVO<Long>(finishEo(eo));
        return der;
    }
    
    MasterDataVO<Long> getBO_Fahrzeugbaum(MasterDataVO<Long> parent, String name) {
        final EntityObjectVO<Long> eo = new EntityObjectVO<Long>(BO_Fahrzeugbaum);
        
        eo.setFieldValue(F_Fahrzeugbaum_knotenname, name);
        eo.setFieldValue(F_Fahrzeugbaum_fahrzeug, name + "Vehicle");
        if (parent != null) {
            eo.setFieldId(F_Fahrzeugbaum_uebergeordnknoten, parent.getPrimaryKey());
        } else {
            eo.setFieldId(F_Fahrzeugbaum_uebergeordnknoten, null);            
        }
        
        final MasterDataVO<Long> result = new MasterDataVO<Long>(finishEo(eo));
        return result;        
    }
    
    MasterDataVO<Long> getBO_Datenbedarf(MasterDataVO<Long> parentFahrzeugbaum, String name) {
        final EntityObjectVO<Long> eo = new EntityObjectVO<Long>(BO_Datenbedarf);
        
        eo.setFieldValue(F_Datenbedarf_sachnummer, name + "Sachnummer");
        eo.setFieldValue(F_Datenbedarf_pfad, name + "Pfad");
        eo.setFieldValue(F_Datenbedarf_modell, name + "Modell");
        eo.setFieldValue(F_Datenbedarf_produktlinie, name + "PL");
        eo.setFieldValue(F_Datenbedarf_link, name + "Link");
        if (parentFahrzeugbaum != null) {
            eo.setFieldId(F_Datenbedarf_fahrzeugbaum, parentFahrzeugbaum.getPrimaryKey());
        } else {
            eo.setFieldId(F_Datenbedarf_fahrzeugbaum, null);            
        }
        
        final MasterDataVO<Long> result = new MasterDataVO<Long>(finishEo(eo));
        return result;        
    }
    
    PdmcaeTreeNode asPdmcaeTreeNode(MasterDataVO<Long> md) {
        final String name = (String) md.getFieldValue(FdmCommon.F_Fahrzeugbaum_knotenname);
        final String vehicle = (String) md.getFieldValue(FdmCommon.F_Fahrzeugbaum_fahrzeug);
        final Number id = md.getPrimaryKey();
        final PdmcaeTreeNode result = new PdmcaeTreeNode(id, name, true, id, name, vehicle);
        
        return result;
    }
    
    DefaultMasterDataTreeNode asDefaultMasterDataTreeNode(MasterDataVO<Long> md, String name) {
        final Long id = md.getPrimaryKey();
        final DefaultMasterDataTreeNodeParameters<Long> params = new DefaultMasterDataTreeNodeParameters<Long>(md.getEntityObject().getDalEntity(), 
                id, null, null, name + "Label", name + "Description");
        final DefaultMasterDataTreeNode<Long> result = new DefaultMasterDataTreeNode<Long>(params);
        return result;
    }
    
    FolderTreeNode asFolderTreeNode2(int level, GenericObjectVO go, List subNodes) {
        final FolderTreeNode result = mock(FolderTreeNode.class);
        when(result.getId()).thenReturn(go.getId());
        when(result.getEntityUID()).thenReturn(FdmCommon.BO_Knoten);
        when(result.hasSubNodes()).thenReturn(subNodes != null && !subNodes.isEmpty());
        when(result.getSubNodes()).thenReturn(subNodes);
        when(result.getLevel()).thenReturn(level);
        return result; 
    }
    
    FolderTreeNode asFolderTreeNode(int level, Long id, UsageCriteria usagecriteria,
            String sIdentifier, Long relationId,
            SystemRelationType relationtype, RelationDirection direction,
            String sUserName, UID state, UID uidNode, Long idRoot) {
        if (usagecriteria == null) {
            usagecriteria = new UsageCriteria(null, null, null, "pseudo-mocked usagecriteria");
        }
        final FolderTreeNode result = new FolderTreeNode(id, usagecriteria,
                sIdentifier, relationId,
                relationtype, direction,
                sUserName, state, uidNode, idRoot);
        result.setLevel(level);
        return result;
    }
        
    Pair<Date,Date> interval() {
        final long now = System.currentTimeMillis();
        Date start = new Date(now + rand.nextInt(1234567890));
        Date end = new Date(now + rand.nextInt(1234567890));
        if (start.after(end)) {
            final Date tmp = start;
            start = end;
            end = tmp;
        }
        return new Pair<Date, Date>(start, end);
    }
    
    void reset() {
    }

    Random getRand() {
        return rand;
    }
    
    <S,T> List<T> list(S... ts) {
        final List<T> result = new ArrayList<T>(ts.length);
        for (S t: ts) {
            result.add((T) t);
        }
        return result;
    }

    <S,T> Set<T> set(S... ts) {
        final Set<T> result = new HashSet<T>(ts.length);
        for (S t: ts) {
            result.add((T) t);
        }
        return result;
    }
}

Die DataFactory stellt die Value Objekte als Eingabe für den Test zur Verfügung. Bei Nuclos handelt es sich dabei oft um EntityObjectVOs, MasterDataVOs und/oder GenericObjectVOs. Das obrige Beispiel benutzt alle 3 Objektarten. Entscheiden für die Tests ist es, (zumindest) für jedes Value Objekt das referenziert, auch einen Primary Key zu hinterlegen. Dies gelingt besonders einfach mit einem Zufallsgenerator, dessen Startbedingung festgelegt wird. Ein solcher Generator liefert nämlich (bei jedem Test) immer wieder die gleiche (Pseudo-Zufalls-)Zahlenfolge. Nummern dieser Folge werden im Beispiel als Primary Key benutzt.