Библиотека TwiP (Test with Parameters) позволяет параметризировать JUnit-тесты имеет достаточно больше преимуществ, чем встроенные в JUnit теории:
Ниже приведен пример использования TwiP:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.sf.twip.TwiP; import net.sf.twip.Values; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(TwiP.class) public class TestWithTwiP { public static Integer[] oddNumbers = {1,3,5,7,9}; public static Integer[] evenNumbers = {2,4,6,8,10}; public static Integer[] methodNumbers() { List<Integer> numbers = new ArrayList<Integer>(); numbers.addAll(Arrays.asList(oddNumbers)); numbers.addAll(Arrays.asList(evenNumbers)); return numbers.toArray(new Integer[10]); } public static List<Integer> methodNumbersList() { List<Integer> numbers = new ArrayList<Integer>(); numbers.addAll(Arrays.asList(oddNumbers)); numbers.addAll(Arrays.asList(evenNumbers)); return numbers; } @Test public void testOddNumbers(@Values("oddNumbers") int oddNumber) { System.out.println("Odd number: " + oddNumber); } @Test public void testEvenNumbers(@Values("evenNumbers") int evenNumber) { System.out.println("Even number: " + evenNumber); } @Test public void testTwoArguments(@Values("oddNumbers") int oddNumber, @Values("evenNumbers") int evenNumber) { System.out.println("Odd number: " + oddNumber); System.out.println("Even number: " + evenNumber); } @Test public void testMethodArgument(@Values("methodNumbers") int number) { System.out.println("Number: " + number); } @Test public void testMethodArgumentReturnsList(@Values("methodNumbersList") int number) { System.out.println("Number: " + number); } @Test public void testCombinedMethodArgument(@Values("methodNumbers") int number, @Values("oddNumbers") int oddNumber) { System.out.println("Number: " + number); System.out.println("Odd number: " + oddNumber); } }
Все методы и переменные, которые являются источниками данных, должны быть публичными и статичными (public static) и должны возвращать только ссылочные типы, примитивы не допускаются.
Для указания, какой источник данных будет использоваться для конкретного параметра используется аннотация @Values, внутри которой указывается имя метода или переменной класса.
При указании нескольких параметров тест будет вызываться для всех возможных комбинаций этих параметров – их декартово произведение. Если нужно вызвать тест и чтобы параметры перебирались синхронно (т.е. из первого источника элемент 0, и из второго источника элемент 0 и т.д.), то необходимо ввести дополнительный класс, который будет содержать пары (или больше) значений и уже его передавать в тест.
Позже напишу про аннотацию @AutoTwip