JUnit @Rule для передачи параметра в тест - PullRequest
12 голосов
/ 17 июня 2010

Я хотел бы создать @Rule, чтобы иметь возможность сделать что-то подобное

@Test public void testValidationDefault(int i) throws Throwable {..}

Где i - параметр, переданный в тест по @Rule.

Однако я получаю

java.lang.Exception: Method testValidationDefault should have no parameters

Есть ли способ обойти его и установить параметр i в @Rule?

Ответы [ 5 ]

8 голосов
/ 05 июня 2012

Как сказал IAdapter, вы не можете передавать аргумент с помощью правил, но вы можете сделать что-то подобное.

Реализуйте правило, которое содержит все значения ваших параметров и оценивает тест один раз для каждого значения параметра и предлагаетзначения через метод, так что тест может извлечь их из правила.

Рассмотрим следующее правило (псевдокод):

public class ParameterRule extends MethodRule{
    private int parameterIndex = 0;
    private List<String> parameters;
    public ParameterRule(List<String> someParameters){ 
        parameters = someParameters;
    }

    public String getParameter(){
        return parameters.get(parameterIndex);
    }

    public Statement apply(Statement st, ...){
        return new Statement{
             public void evaluate(){
                 for (int i = 0; i < parameters.size(); i++){
                     int parameterIndex = i;
                     st.evaluate()
                 }      
             }
        }
    }
}

Вы должны иметь возможность использовать это в тестекак это:

 public classs SomeTest{
     @Rule ParameterRule rule = new ParameterRule(ArrayList<String>("a","b","c"));

     public void someTest(){
         String s = rule.getParameter()

         // do some test based on s
     }
 }
8 голосов
/ 17 июня 2010

Я использую @Parameters и @RunWith(value = Parameterized.class) для передачи значений в тесты.Пример можно найти здесь .

Я не знал об аннотации @Rule, но после прочтения этого поста я думаю, что он служит другой цели, чем передачапараметры для тестов:

Если в вашем классе тестов вы создаете поле, указывающее на объект, реализующий интерфейс MethodRule, и помечаете его как обрабатываемый как правило, добавляя реализацию @Ruleзатем JUnit будет вызывать ваш экземпляр для каждого запускаемого теста, что позволит вам добавить дополнительное поведение к выполнению теста.

Надеюсь, это поможет.

1 голос
/ 05 декабря 2012

недавно я начал zohhak проект.это позволяет вам писать тесты с параметрами (но это бегун, а не правило):

@TestWith({
   "25 USD, 7",
   "38 GBP, 2",
   "null,   0"
})
public void testMethod(Money money, int anotherParameter) {
   ...
}
0 голосов
/ 13 декабря 2011

Следует отметить, что больше нельзя утверждать, что вы не можете передавать параметры непосредственно в метод тестирования.Теперь это можно сделать с помощью Theories и @DataPoints / @DataPoint.

Например:

@RunWith(Theories.class)
public class TestDataPoints {

    @DataPoints
    public static int [] data() {
        return new int [] {2, 3, 5, 7};
    }

    public int add(int a, int b) {
        return a + b;
    }

    @Theory
    public void testTheory(int a, int b) {
        System.out.println(String.format("a=%d, b=%d", a, b));
        assertEquals(a+b, add(a, b));
    }
}

Выход:

a=2, b=2
a=2, b=3
a=2, b=5
a=2, b=7
a=3, b=2
a=3, b=3
a=3, b=5
a=3, b=7
a=5, b=2
a=5, b=3
a=5, b=5
a=5, b=7
a=7, b=2
a=7, b=3
a=7, b=5
a=7, b=7

С прохождением теста.

0 голосов
/ 11 января 2011

это невозможно, вы не можете передать параметры в метод тестирования, даже используя @ Rule.

...