О применении рефлексии в тестировании и не только

в 13:29, , рубрики: java, новичкам

У многих рефлексия ассоциируется с раздутым кодом или с не правильным продуманным api.
Под катом несколько полезных примеров, которые покажут положительные стороны рефлексии.

О применении рефлексии в тестировании и не только - 1


Тренироваться будем на утках сортировках.

public interface ISort {
    int[] sort(int[] ints);
}

public class MergeSort implements ISort {
    // Реализация сортировки
}

public class QuickSort implements ISort {
    // Реализация сортировки
}

Сразу представим себе ситуацию, что сортировок мы хотим изучить много, хотим, чтобы все они работали и были оттестированы.

Однако писать на все алгоритмы тесты нам лень. Поэтому мы протестируем только интерфейс ISort, а все остальные классы, как бы сами собой будут протестированы )

// Делаем тест в виде шаблона
public abstract class ISortTest<T extends ISort> {
    private Class<T> aClass;
    private T sortAlgorithm;

    public ISortTest() {
        // Получаем тип дженерика заданного в шаблоне
        aClass = Optional.of(getClass())
                .map(Class::getGenericSuperclass)
                .filter(el -> el instanceof ParameterizedType)
                .map( el -> (ParameterizedType) el)
                .filter(el -> el.getActualTypeArguments().length > 0)
                .map(el -> el.getActualTypeArguments()[0])
                .filter(el -> el instanceof Class)
                .map(el -> (Class<T>) el)
                .orElse(null);
    }

    @BeforeEach
    void init() throws IllegalAccessException, InstantiationException {
        // Получаем экземпляр конкретной сортировки
        sortAlgorithm = aClass.newInstance();
    }

    @Test
    void sortTest() {
        assertNotNull(sortAlgorithm);
        int n = 10000;
        int[] ints = new Random().ints().limit(n).toArray();

        int[] sortInts = Arrays.stream(ints)
                .sorted()
                .toArray();

        int[] testSotrInts = sortAlgorithm.sort(ints);
        assertArrayEquals(sortInts, testSotrInts);
    }
}

Ну вот и всё, теперь можно официально объявить о победе лени.

Тестирование сортировок теперь будет сведено к созданию таких вот классов

class MergeSortTest extends ISortTest<MergeSort> {
      // Тут ничего нет
}

class QuickSortTest extends ISortTest<QuickSort> {
      // Тут ничего нет
}

Подобный подход применяется, например, в Spring Data

public interface TestRepository extends CrudRepository<MyEntity, Long> {
}

А так же в других местах, о которых мы даже и не догадываемся.

Автор: Бабанин Максим

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js