Используйте разные параметры для конкретного теста
В Junit 4
параметризованное тестирование, если у меня есть 3 теста в классе тестирования, и я хочу использовать другой параметр для конкретного теста, как мне это сделать?
Допустим, 3-й тест проверяет, выбрасывает ли конкретное исключение. Поэтому мне нужно передать неверные параметры только для этого теста.
@RunWith(Parameterized.class)
public class EvenNumberProcessorTest {
private int num1;
private int num2;
public int EvenNumberProcessorTest(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
@Parameterized.Parameters
public static Collection<Integer[]> numbers() {
return Arrays.asList(new Integer[][] {
{4, 2},
{5, 2}
});
}
@Test
public void testCheckDivision() {
Assert.asserEquals(true, EvenNumberProcessor.checkDivision(num1, num2));
}
@Test(expected = MyException.class)
public void testCheckDivisionFail() {
DivisionProcessor.checkDivision(3, 0);
}
}
public boolean checkDivision(int num1, num2) {
boolean result = false;
try {
if (num1 % num2 == 0) {
result = true;
} else {
result = false;
}
} catch (ArithmeticException e) {
throw new MyException("You can not use 0 to divide");
}
return result;
}
2 ответа
@Parameterized
это слишком тяжело для этого. попробуйте что-нибудь попроще. Пример ниже с использованием zohhak и assertj
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.googlecode.zohhak.api.TestWith;
import com.googlecode.zohhak.api.runners.ZohhakRunner;
@RunWith(ZohhakRunner.class)
public class MyTest {
@Test(expected=IllegalArgumentException.class)
public void should_throw_exception_on_division_by_zero() {
checkDivision(3, 0);
}
@TestWith({
"4, 2, true",
"5, 2, false"
})
public void should_check_if_divisable(int num1, int num2, boolean isDivisible) {
assertThat(checkDivision(num1, num2)).isEqualTo(isDivisible);
}
public boolean checkDivision(int num1, int num2) {
...
}
}
Вы можете передать ожидаемый результат в конструкторе теста, добавив еще один параметр. Я обновил ваш код, чтобы отразить это ниже:
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class EvenNumberProcessorTest {
private final int num1;
private final int num2;
private final boolean expectFailure;
public EvenNumberProcessorTest(int num1, int num2, boolean expectFailure) {
this.num1 = num1;
this.num2 = num2;
this.expectFailure = expectFailure;
}
@Parameterized.Parameters
public static Collection<Object[]> numbers() {
return Arrays.asList(new Object[][] { { 4, 2, false }, { 5, 0, true } });
}
@Test
public void testCheckDivision() {
try {
boolean result = EvenNumberProcessor.checkDivision(num1, num2);
if (expectFailure) {
junit.framework.Assert.fail("MyException expected but not thrown.");
} else {
junit.framework.Assert.assertEquals(true, result);
}
} catch (Exception ex) {
if (!expectFailure) {
junit.framework.Assert.fail("MyException not expected but thrown.");
}
}
}
}
Как вы уже догадались, вы можете передать ожидаемый результат (true/false) в конструктор.