2013-11-14 1 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 {} 

그렇지 않으면 MyAnnotationRunner에서 computeTestMethods() 빈을 반환한다 명부. 당신은뿐만 아니라 @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

'@ Retention' 주석 ... 너무 단순하지만 잊어 버린 것이 하나 있습니다. 'computeTestMethods()'를 바꾸는 것도 좋은 지적이다.'JUnit4Builder'와 내 자신의 빌더를 가지고 있으면 작업을 할 수는 있지만 실제로는 그렇지 않을 것이라고 생각했다. 어쨌든 감사합니다! :-) – blalasaadri

관련 문제