Ответ 1
это невозможно, вы не можете передавать параметры для тестирования даже с помощью @Rule.
Я хотел бы создать @Rule
, чтобы иметь возможность сделать что-то вроде этого
@Test public void testValidationDefault(int i) throws Throwable {..}
Где я - параметр, переданный в тест @Rule
.
Однако я получаю
java.lang.Exception: Method testValidationDefault should have no parameters
есть ли способ обойти его и установить параметр я в @Rule
?
это невозможно, вы не можете передавать параметры для тестирования даже с помощью @Rule.
Я использую @Parameters
и @RunWith(value = Parameterized.class)
для передачи значений в тесты. Пример можно найти здесь.
Я не знал о аннотации @Rule
, но после прочтения этого сообщения, я думаю, что он служит другой цели, кроме передачи параметров в тесты:
Если в вашем тестовом классе создается поле, указывающее на объект, реализующий интерфейс MethodRule, и вы отмечаете, что это должно обрабатываться как правило, добавив реализацию @Rule, тогда JUnit вернет ваш экземпляр для каждого тест будет запущен, что позволит вам добавить дополнительное поведение во время выполнения теста.
Надеюсь, это поможет.
Как сказал 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
}
}
Недавно я начал проект 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
Прохождение теста.