JUnit @Rule для передачи параметра в тест
Я хотел бы создать @Rule
чтобы иметь возможность делать что-то подобное
@Test public void testValidationDefault(int i) throws Throwable {..}
где i-параметр, переданный тесту @Rule
.
java.lang.Exception: Method testValidationDefault should have no parameters
есть ли способ обойти его и установить параметр i в @Rule
?
5 ответов
Как сказал 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
}
}
Я использую @Parameters
и @RunWith(value = Parameterized.class)
для передачи значений для тестов. Пример можно найти здесь.
Я не знал о @Rule
аннотации, но после прочтения этот пост, Я думаю, что это служит другой цели, чем передача параметров в тестах:
Если в тестовом классе вы создаете поле, указывающее на объект, реализующий интерфейс MethodRule, и отмечаете это, как правило, путем добавления @Rule реализация, затем JUnit перезвонит на ваш экземпляр для каждого теста, который он будет запускать, что позволит вам добавить дополнительное поведение вокруг выполнения теста.
надеюсь, это поможет.
недавно я начал zohhak. он позволяет писать тесты с параметрами (но это бегун, а не правило):
@TestWith({
"25 USD, 7",
"38 GBP, 2",
"null, 0"
})
public void testMethod(Money money, int anotherParameter) {
...
}
следует отметить, что больше не верно, что вы не можете передавать параметры непосредственно методу тестирования. Теперь это можно сделать с помощью 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
С прохождением теста.
Это невозможно сделать, вы не можете передавать параметры для метода тестирования даже с помощью @Rule.