2013-10-09 5 views
1

Прямо сейчас, у меня есть этот простой набор тестов:Построение тестовых наборов в JUnit 4

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    CommentingTest.class, 
    SubscriptionsTest.class, 
    EditingTest.class, 
    BasicOperationsTest.class 
}) 
public class WebTestSuite { } 

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

@RunWith(Suite.class) 
public class WebTestSuite { 
    public WebTestSuite() { 
     this.addTest(new CommentingTest(Accounts.ADMIN, ViewMode.A)); 
     this.addTest(new CommentingTest(Accounts.ADMIN, ViewMode.B)); 
     this.addTest(new CommentingTest(Accounts.GUEST, ViewMode.B)); 
     this.addTest(new SubscriptionsTest(Accounts.ADMIN, ViewMode.A)); 
     this.addTest(new SubscriptionsTest(Accounts.ADMIN, ViewMode.B)); 
     this.addTest(new SubscriptionsTest(Accounts.GUEST, ViewMode.B)); 
     this.addTest(new EditingTest(Accounts.ADMIN, ViewMode.A)); 
     this.addTest(new EditingTest(Accounts.ADMIN, ViewMode.B)); 
     this.addTest(new EditingTest(Accounts.GUEST, ViewMode.B)); 
     this.addTest(new BasicOperationsTest(Accounts.ADMIN, ViewMode.A)); 
     this.addTest(new BasicOperationsTest(Accounts.ADMIN, ViewMode.B)); 
     this.addTest(new BasicOperationsTest(Accounts.GUEST, ViewMode.B)); 
    } 
} 

Но я не могу понять, как сделать что-то вроде этого. Есть идеи? Благодаря!

ответ

2

Вы не можете сделать это так, как вы указали, потому что классы тестов должны иметь конструктор no-arg.

Есть 2 варианта, которые можно сделать в зависимости от того, что тесты, как:

Вариант 1. Сделать абстрактные тестовые классы с подклассов, которые имеют параметры:

Сделать абстрактные классы тестов со всеми своими тесты затем содержат подклассы переменной информации. Абстрактный класс может принимать параметры в конструкторах, конструктор подкласса no-arg вызывает super(...) с соответствующими параметрами.

public abstract class AbstractCommentingTest{ 

    private Account account; 
    private ViewMode mode; 

    public AbstractCommentingTest(Account a, ViewMode v){ 
     this.account=a; 
     this.viewMode = v; 
    } 


    //Put your tests here using the given account and view 
    @Test 
    public void foo(){ 

    } 

    @Test 
    public void bar(){ 

    } 


} 

Тогда ваши конкретные классы

public class AdminViewACommentingTest extends AbstractCommentingTest{ 
     //no-arg constructor for JUnit 
     public AdminViewACommentingTest(){ 
      super(Accounts.ADMIN, Viewmode.A); 
     } 
} 

Это работает, но может получить из рук быстро, если есть много вариантов

Вариант 2: Использование JUnit параметризованные тесты, чтобы иметь все возможные комбинации опций:

Я предполагаю, что учетные записи и ViewMode являются перечислениями? Если это так, вы можете легко использовать метод values() для создания всех возможных комбинаций в составе тестового набора с параметрами.

@RunWith(Parameterized.class) 
public class CommentingTest{ 

    @Parameters 
    public static Collection<Object[]> createData(){ 
       List<Object[]> data = new ArrayList<Object[]>(); 

       for(Accounts account : Accounts.values()){ 
        for(ViewMode view : ViewMode.values()){ 
         data.put(new Object[]{account, view}); 
        } 
        } 
       return data; 
    } 


    private Account account; 
    private ViewMode mode; 

    public CommentingTest(Account a, ViewMode v){ 
     this.account=a; 
     this.viewMode = v; 
    } 

    //Put your tests here using the given account and view 
    @Test 
    public void foo(){ 

    } 

    @Test 
    public void bar(){ 

    } 

}

Смежные вопросы