2013-09-12 2 views
1

В JUnit, вы можете создавать тестовые наборы так:В наборах тестов JUnit поддерживаются пользовательские аннотации?

public class SecurityTest1 { 
    @Test 
    public void testSecurity1() { 
     // ... 
    } 
} 

public class LoadTest1 { 
    @Test 
    public void testLoad1() { 
     // ... 
    } 
} 

public class SecurityTest2 { 
    @Test 
    public void testSecurity2() { 
     // ... 
    } 
} 

@RunWith(Suite.class) 
@SuiteClasses({SecurityTest1.class, SecurityTest2.class}) 
public class SecurityTestSuite {} 

Но это кажется довольно громоздким. Было бы хорошо, чтобы определить простой класс уровня аннотацию:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface SecurityTest {} 

А затем определить свой набор так:

@SecurityTest 
public class SecurityTest1 { 
    @Test 
    public void testSecurity1() { 
     // ... 
    } 
} 

public class LoadTest1 { 
    @Test 
    public void testLoad1() { 
     // ... 
    } 
} 

@SecurityTest 
public class SecurityTest2 { 
    @Test 
    public void testSecurity2() { 
     // ... 
    } 
} 

@RunWith(Suite.class) 
@SuiteClasses({SecurityTest.class}) 
public class SecurityTestSuite {} 

Возможно ли это? Если да, то как? Примечание: не заинтересован в переключении на TestNG или в любой другой среде тестирования, если JUnit не поддерживает это ... спасибо заранее!

+0

Посмотрите в реализации собственного 'BlockJUnit4ClassRunner'. –

ответ

1

Вы можете сделать это, реализовав свой собственный Test Runner, похожий на бегун Suite.

Этот бегун должен извлечь класс аннотации маркера из значения аннотации @SuiteClasses (возможно, вы должны заменить @SuiteClasses своей аннотацией). Взгляните на метод getAnnotatedClasses класса org.junit.runners.Suite.
После класса маркеров аннотации вы должны отсканировать путь к классам для классов тестов, помеченных этой аннотацией (используйте библиотеку, такую ​​как Reflections) и передайте массив из них соответствующему конструктору Runner.
Вы можете найти подобное поведение в Suite конструктору:

public Suite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
    this(builder, klass, getAnnotatedClasses(klass)); 
} 
Смежные вопросы