2017-05-16 2 views
1

Für Unit-Tests ich gutes und schlechtes Szenario testen willMockito Unit-Test: Fabrik erstellen newInstance

Ich bin ein bisschen auf der Factory.createFoo() -Methode stecken zu bleiben. Wie kann ich die richtige Unit-Tests für diese (mit Mockito)

public class Bar extends Foo { 
    public Bar() {} 
    public Bar(Scenario scenario){ 
     ...DoStuff.. 
    } 
} 

public static <T extends Foo> T createFoo(Class<T> fooClass) throws RuntimeException { 
    try { 
     return fooClass.newInstance(); 
    } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { 
     throw new RuntimeException("Could not create the Foo: " + fooClass.getSimpleName(), e); 
    } 
} 

public static <T extends Foo> T createFoo(Scenario scenario, Class<T> fooClass) throws RuntimeException { 
    try { 
     return fooClass.getDeclaredConstructor(Scenario.class).newInstance(scenario); 
    } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { 
     throw new RuntimeException("Could not create the needed Foo: " + fooClass.getSimpleName(), e); 
    } 
} 

Ich möchte in der Lage sein, schreiben die folgenden Teile zu verspotten:

fooClass.newInstance(); 

fooClass.getDeclaredConstructor(Scenario.class).newInstance(scenario); 

ich einige Fabrik Beispiele gefunden habe, aber alle ohne das generische

machen diese Beispiele für mich ungültig.

Wie geht man vor, um diese Art von Fabrikmethoden zu testen? Wenn es einen Designfehler gibt, der dies nicht testbar macht, zögere nicht, mir diese Fehler zu zeigen ;-)

+0

Persönlich würde ich diese Methoden nicht verspotten, weil das grundlegende Java.lang ist. Ich denke, es ist völlig in Ordnung, zu testen, ob die Factory-Methode zum Beispiel eine Instanz eines Objekts zurückgibt, das gleich dem neuen T() ist. –

+0

Wie komme ich dann in den Fangen? im Moment läuft es immer. –

+0

Ja Entschuldigung, ich habe gerade bemerkt, dass ich das vermisst habe. Lass mich sehen, ob ich etwas zum Laufen bringen kann. –

Antwort

0

Anstatt zu spotten, wäre es nicht einfacher, einen Test mit realen Klassen einzurichten, die das verursachen erforderliche Ausnahmen werden ausgelöst?

Beispiel: Um ein InstantiationException Sie können in einer abstrakten Klasse übergeben (definiert als eine verschachtelte Klasse in Ihrem Test) zu erhalten und ein IllegalAccessException Sie können mit einem privaten nicht-args Konstruktor zu bekommen in einer Klasse senden. Testen Sie dann, ob RuntimeException ausgelöst wurde.