2016-03-24 10 views
0

Ich habe Methode, die ein Domain-Objekt (eine sehr komplexe verschachtelte Objektstruktur) als Parameter nimmt einige Operation und gibt ein Ergebnis zurück. Ich muss einen Junit-Test für diese Methode erstellen, für die ich Daten in das komplexe Objekt setzen muss. Ich möchte den Prozess der Erstellung von Scheindaten für meinen Junit-Test automatisieren. Ich möchte: Die Objekte/Primitive des komplexen Objektbaums, die in meiner Methode aufgerufen werden, sollten automatisch identifiziert werden (durch Analyse des Codes oder anderweitig) und Setter für diese Felder sollten aufgerufen werden. Jede Hilfe wird geschätzt.Erzeuge Daten für Junit automatisch

Antwort

1

Ich habe nicht versucht, PODAM (POjo Data Mocker), aber es ist ein Werkzeug zu "Autofill Pojos mit erfundenen Daten".

Sie könnten es auschecken - es scheint konfigurierbar zu sein, und standardmäßig beide Konstruktor Argumente und Setter zu verwenden.

Wenn Sie Lust haben, mit Ihrem eigenen/eigenen Test-Utility zu experimentieren, könnten Sie etwas in dieser Richtung tun (- ich gebe zu, dass der String-Check auf "set" etwas hässlich ist: es könnte eine Methode sein KEIN Setter die Logik erweitert werden könnte. Ist das nächste Zeichen in Versalien Gibt es einen Feldnamen übereinstimmen)

public void populateObjectWithRandomValuesUsingReflection(Object object) { 
    List<Object> argsList; 
    for (Method method : object.getClass().getMethods()){ 
     argsList = new ArrayList(); 
     if (resemblesASetterMethod(method)){ 
      for (Class<?> parameterClass : method.getParameterTypes()){ 
       if (parameterClass.isPrimitive()){ 
        argsList.add(getRandomValueOfPrimitive(parameterClass)); 
       } else { 
        throw new UnsupportedOperationException("This jUnit test utility does not yet support non-primitive types."); 
       } 
      } 
      invokeMethod(method, object, argsList.toArray()); 
     } 
    } 
} 

private void invokeMethod(Method method, Object object, Object[] args) { 
    try { 
     method.invoke(object, args); 
    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { 
     Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

private boolean resemblesASetterMethod(Method method){ 
    return method.getName().startsWith("set"); 
} 

obigen Beispiel nur Primitive unterstützen, aber auch hier können Sie diesen Beispielcode erweitern?.

Zur Erstellung (Pseudo-) Zufallswerte gibt es Rahmen, fx:

  • org.apache.commons.lang.RandomStringUtils
  • java.util.Random