2016-07-10 12 views
1

Ich möchte Tests mit der Erweiterung von ParentRunner ausführen. Ich mache das zum Lernen, kein bestimmtes Szenario. Ich habe die Klassen darunter und darunter gibt es auch die Ausgabe. Ich verstehe ein paar Dinge nicht: 1. Warum wird "describeChild" 3 mal wiederholt aufgerufen? 2. Warum die Tests nicht ausgeführt wurden ("doOne" und "doTwo")? Diese Zeile wird unkommentiert: // Ergebnis result = JUnitCore.runClasses (arg0.getClass()); führt die Tests aus, aber ich verstehe nicht, warum funktioniert es so? 3. und vor allem - was ist mit dieser Zeile: @SuiteClasses ({ChildOne.class, ChildTwo.class})? es auf das Verhalten des Codes keinen Einfluss hatte ... Vielen Dank an alle, die :-)Erweitern ParentRunner in Junit

Klasse

Suite reagiert:

@RunWith(FamilyRunner.class) 
@SuiteClasses({ChildOne.class, ChildTwo.class, ChildThree.class}) 
public class Suite { 
//nothing here 
} 

Runner Klasse:

public class FamilyRunner extends ParentRunner<ParentClass>{ 

public FamilyRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
} 


@Rule 
public TestName name = new TestName(); 

@Override 
protected List<ParentClass> getChildren() { 

    List<ParentClass> list = new ArrayList<>(); 
    System.out.println("Adding items to list"); 
    list.add(new ChildOne()); 
    list.add(new ChildTwo()); 

    return list; 
} 


@Override 
protected Description describeChild(ParentClass arg0) { 
    System.out.println("describeChild class: " + arg0.getClass().getSimpleName()); 
    Description desc = Description.createTestDescription(name.getMethodName(), 
      name.getMethodName(), getClass().getAnnotations()); 

    return desc; 
} 

@Override 
protected void runChild(ParentClass arg0, RunNotifier arg1) { 
    System.out.println("runChild " + arg0.getClass().getSimpleName()); 
    //Result result = JUnitCore.runClasses(arg0.getClass()); 
} 
} 

und:

public class ParentClass { 

    public ParentClass() { 
     System.out.println("created parent class"); 
    } 
} 

public class ChildOne extends ParentClass { 
    public ChildOne() { 
     System.out.println("created ChildOne class"); 
    } 

    @Test 
    public void doOne(){ 
     System.out.println("doOne"); 
    } 
} 

public class ChildTwo extends ParentClass { 
    public ChildTwo() { 
     System.out.println("created ChildTwo class"); 
    } 

    @Test 
    public void doTwo(){ 
     System.out.println("doTwo"); 
    } 
} 

Die Konsole druckt:

Adding items to list 
created parent class 
created ChildOne class 
created parent class 
created ChildTwo class 
describeChild class: ChildOne 
describeChild class: ChildTwo 
describeChild class: ChildOne 
describeChild class: ChildTwo 
describeChild class: ChildOne 
describeChild class: ChildTwo 
runChild ChildOne 
runChild ChildTwo 

Antwort

0

Ich kann einige Fragen beantworten.

Über @SuiteClasses ({ChildOne.class, ChildTwo.class}) erstellen Sie die Liste nicht mit diesen Annotationswerten.

Sie können dies tun:

protected List<ParentClass> getChildren() { 
    Annotation[] runnerAnnotations = super.getRunnerAnnotations(); 
    System.out.println(runnerAnnotations); 

    Optional<Annotation> suitClass = Arrays.stream(runnerAnnotations) 
      .filter(a -> a.annotationType().equals(SuiteClasses.class)) 
      .findFirst(); 

    List<ParentClass> list = new ArrayList<>(); 
    if (suitClass.isPresent()) { 
     SuiteClasses s = (SuiteClasses) suitClass.get(); 
     s.value(); 
     System.out.println("Adding items to list"); 
     for (Class<?> c : s.value()) { 
      Class<ParentClass> cp = (Class<ParentClass>) c; 
      try { 
       list.add(cp.newInstance()); 
      } catch (InstantiationException | IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return list; 
} 

Ich glaube, Sie weitere Informationen in org.junit.runners.Suite Quelle finden: http://grepcode.com/file/repo1.maven.org/maven2/junit/junit/4.8.1/org/junit/runners/Suite.java