Как стать автором
Обновить

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

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


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

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> {
}

А так же в других местах, о которых мы даже и не догадываемся.
Теги:
Хабы:
Всего голосов 15: ↑10 и ↓5+5
Комментарии18

Публикации

Истории

Работа

Java разработчик
395 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн