Введение в Jukito

Введение в Jukito

1. обзор

Jukito - это объединенная мощностьJUnit,Guice иMockito - используется для упрощения тестирования нескольких реализаций одного и того же интерфейса.

В этой статье мы увидим, как авторам удалось объединить эти три библиотеки, чтобы помочь нам сократить количество шаблонного кода, сделав наши тесты гибкими и простыми.

2. Настройка

Сначала мы добавим в наш проект следующую зависимость:


    org.jukito
    jukito
    1.5
    test

Последнюю версию можно найти наMaven Central.

3. Различные реализации интерфейса

Чтобы начать понимать мощь Jukito, мы собираемся определить простой интерфейсCalculator с помощью методаAdd:

public interface Calculator {
    public double add(double a, double b);
}

И мы собираемся реализовать следующий интерфейс:

public class SimpleCalculator implements Calculator {

    @Override
    public double add(double a, double b) {
        return a + b;
    }
}

Нам также нужна другая реализация:

public class ScientificCalculator extends SimpleCalculator {
}

Теперь давайте воспользуемся Jukito для тестирования обеих наших реализаций:

@RunWith(JukitoRunner.class)
public class CalculatorTest {

    public static class Module extends JukitoModule {

        @Override
        protected void configureTest() {
            bindMany(Calculator.class, SimpleCalculator.class,
              ScientificCalculator.class);
        }
    }

    @Test
    public void givenTwoNumbers_WhenAdd_ThenSumBoth(@All Calculator calc) {
        double result = calc.add(1, 1);

        assertEquals(2, result, .1);
    }
}

В этом примере мы видимJukitoModule, который подключается во всех указанных реализациях.

Аннотация@All берет все привязки одного и того же интерфейса, сделанныеJukitoModule, и запускает тестwith all the different implementations injected at runtime.

Если мы запустим тесты, мы увидим, что на самом деле два теста выполняются вместо одного:

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

4. Декартово произведение

Теперь давайте добавим простой вложенный класс для различных комбинаций тестов для нашего методаAdd:

public static class AdditionTest {
    int a;
    int b;
    int expected;

    // standard constructors/getters
}

Это расширит количество тестов, которые мы можем запустить, но сначала нам нужно добавить дополнительные привязки в наш методconfigureTest:

bindManyInstances(AdditionTest.class,
  new AdditionTest(1, 1, 2),
  new AdditionTest(10, 10, 20),
  new AdditionTest(18, 24, 42));

И, наконец, мы добавляем еще один тест в наш пакет:

@Test
public void givenTwoNumbers_WhenAdd_ThenSumBoth(
  @All Calculator calc,
  @All AdditionTest addTest) {

    double result = calc.add(addTest.a, addTest.b);

    assertEquals(addTest.expected, result, .1);
}

Сейчасthe @All annotation is going to produce the Cartesian product of the different combinations between the different implementations of the Calculator interface and the AdditionTest instances.

Мы можем взглянуть на увеличенное количество тестов, которые оно сейчас производит:

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

Мы должны помнить, что количество запусков тестов для декартовых произведений резко возрастает.

Время выполнения всех тестов будет расти линейно с количеством выполнений. i: e .: метод тестирования с тремя параметрами с аннотацией@All и четырьмя привязками на параметр будет выполнен 4 x 4 x 4 = 64 раза.

Наличие пяти привязок для одного и того же метода испытаний приведет к 5 x 5 x 5 = 125 выполнений.

5. Группировка по именам

Последняя особенность, которую мы обсудим, - это группировка по имени:

bindManyNamedInstances(Integer.class, "even", 2, 4, 6);
bindManyNamedInstances(Integer.class, "odd", 1, 3, 5);

Здесь мы добавили несколько именованных экземпляров целочисленного класса в наш методconfigureTest, чтобы продемонстрировать, что можно сделать с этими группами.

А теперь добавим еще несколько тестов:

@Test
public void givenEvenNumbers_whenPrint_thenOutput(@All("even") Integer i) {
    System.out.println("even " + i);
}

@Test
public void givenOddNumbers_whenPrint_thenOutput(@All("odd") Integer i) {
    System.out.println("odd " + i);
}

В приведенном выше примере будут напечатаны шесть строк: «четные 2», «четные 4», «четные 6», «нечетные 1», «нечетные 3», «нечетные 5».

Имейте в виду, что их порядок не гарантируется во время выполнения.

6. Заключение

В этом кратком руководстве мы рассмотрели, как Jukito позволяет использовать целый набор тестов, предоставляя только достаточное количество комбинаций тестов.

Полный пример можно найти вover on GitHub.