2013-11-14 95 views
1

對於一組JUnit 4.11測試,我創建了一個自己的註釋(我們稱之爲@MyTest),我將其應用於某些單元測試。現在,我必須用@Test@MyTest對這些測試進行註釋 - 這不是我認爲的最佳解決方案。由於繼承是不可能的註釋我已經嘗試建立一個自定義亞軍,但迄今沒有成功。這裏是什麼樣子至今:爲JUnit創建自己的@Test註釋

public class MyRunner extends Suite { 

    public MyRunner(Class<?> klass, RunnerBuilder builder) 
      throws InitializationError { 
     super(klass, modifyBuilder(builder)); 
    } 

    private static final RunnerBuilder modifyBuilder(RunnerBuilder builder) { 
     if(AllDefaultPossibilitiesBuilder.class.isAssignableFrom(builder.getClass())) {  
      return new AllDefaultPossibilitiesBuilder(true) { 
       @Override 
       public Runner runnerForClass(Class<?> testClass) 
         throws Throwable { 
        List<RunnerBuilder> builders = Arrays.asList(
          ignoredBuilder(), 
          annotatedBuilder(), 
          suiteMethodBuilder(), 
          junit3Builder(), 
          junit4Builder(), 
          myTestBuilder()); 

        for (RunnerBuilder each : builders) { 
         Runner runner = each.safeRunnerForClass(testClass); 
         if (runner != null) { 
          return runner; 
         } 
        } 
        return null; 
       } 

       private RunnerBuilder myTestBuilder() { 
        return new RunnerBuilder() { 

         @Override 
         public MyAnnotationRunner runnerForClass(Class<?> testClass) 
           throws Throwable { 
          return new MyAnnotationRunner(testClass); 
         } 
        }; 
       } 
      }; 
     } else { 
      return builder; 
     } 
    } 
} 

而且MyAnnotationRunner類:

public class MyAnnotationRunner extends BlockJUnit4ClassRunner { 

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

    @Override 
    protected List<FrameworkMethod> computeTestMethods() { 
     return getTestClass().getAnnotatedMethods(MyTest.class); 
    } 

    @Override 
    protected void validateTestMethods(List<Throwable> errors) { 
     validatePublicVoidNoArgMethods(MyTest.class, false, errors); 
    } 
} 

但是到目前爲止,當我運行它並不關心@MyTest註釋測試;事實上,如果我在構建器列表中註釋掉junit4Builder(),行,它根本不運行任何測試。

我走錯了路,還是這是正確的想法,但目前爲止還不完整? (我不能切換到TestNG的或其他測試框架,如果有人想建議。)

編輯:

的溶液(Bobbo的建議)是不是在發佈的代碼以上 - 看起來這一切都是正確的。然而,@MyTest註釋缺少@Retention註釋;正確的定義應該是這樣的:

@Retention(RetentionPolicy.RUNTIME) 
public @interface MyTest { } 

回答

1

確保您的MyTest的註釋被設置在運行時使用的保留註釋予以保留,即

@Retention(RetentionPolicy.RUNTIME) 
public @interface MyTest {} 

否則computeTestMethods()MyAnnotationRunner將返回一個空名單。

另外,如果你想運行任何與@Test註釋,以及,你需要的方法更改爲類似如下:

protected List<FrameworkMethod> computeTestMethods() { 
    List<FrameworkMethod> methods = new ArrayList<>(); 
    methods.addAll(getTestClass().getAnnotatedMethods(Test.class)); 
    methods.addAll(getTestClass().getAnnotatedMethods(MyTest.class)); 
    return methods; 
} 

使用套房,你我沒有測試過這雖然,我只是運行測試類使用亞軍,它似乎工作,你需要:

@RunWith(MyAnnotationRunner.class) 
public class Tests { 
    @Test 
    public void testUsingNormalTestAnnotation() { 
     Assert.fail(); 
    } 

    @MyTest 
    public void testUsingMyTestAnnotation() { 
     Assert.fail(); 
    } 
} 
+0

該死的@保留註釋...這麼簡單,但那是我忘了一件事。 :-D改變'computeTestMethods()'也是一個好點,我認爲既然'JUnit4Builder'和我自己的Builder都可以完成這項工作,但顯然不是。不管怎樣,謝謝! :-) – blalasaadri

相關問題