Библиотека 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