2016-07-10 1 views
1

ParentRunnerから拡張してテストを実行したいと思います。 私は学習のためにそれをしていますが、特定のシナリオではありません。 私は下のクラスも出力もあります。 私はいくつかのことを理解していません: 1.なぜ "describeChild"は3回繰り返し呼び出されますか? 2.テストが実行されなかった理由(「doOne」および「doTwo」)? この行のコメントを外してください: //結果の結果= JUnitCore.runClasses(arg0.getClass()); はテストを実行していますが、なぜそれがそのように機能するのか分かりません。 3.そして何よりも - その行について: @SuiteClasses({ChildOne.class、ChildTwo.class})? それが応答誰にも... 感謝コードの動作に影響を及ぼさなかった JunitでParentRunnerを拡張する

:-)スイートクラス:

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

ランナークラス:

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()); 
} 
} 

と:

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"); 
    } 
} 

コンソールの出力:

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 

答えて

0

私はいくつかの質問に答えることができます。

について@SuiteClasses({ChildOne.class、ChildTwo.class})については、この注釈値を使用してリストを構築していません。

あなたがこれを行うことができます

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; 
} 

私はあなたがorg.junit.runners.Suiteソースでより多くの情報を見つけることができると思う:http://grepcode.com/file/repo1.maven.org/maven2/junit/junit/4.8.1/org/junit/runners/Suite.java

関連する問題