Страницы

Поиск по вопросам

суббота, 15 июня 2019 г.

Надо ли создавать интерфейсы для публичных методов, служащих только для тестирования?

У меня есть геттеры и сеттеры, которые используются только для юнит-тестов. Надо ли их оформлять в интерфейсах или можно просто в тестах обращаться не через интерфейс, а напрямую?


Ответ

Судя по всему у вас не верный подход к юнит-тестированию. Как сказал Mikhail Vaysman в своем комментарии:
тестируйте поведение объектов, а не состояние
Ваш класс служит какой-то цели и имеет набор публичных методов, а значит и нужно тестировать именно поведение этих методов, а не внутреннюю реализацию класса. По большому счету, человек пишущий тесты может вообще не знать о том как реализован класс, ему важно только иметь описание публичных членов класса и оперировать ими при написании теста.
Для примера представим, что у вас есть самописный класс дублирующий StringBuilder. Допустим внутри класса есть приватное поле типа char[] хранящее введенную строку посимвольно.
Вы хотите протестировать метод void append(String s), который должен добавить в конец хранимой на текущей момент строки переданную в качестве аргумента метода строку. Суть тестирования в данном случае в том, что объект класса при вызове метода toString() должен вернуть строку того, что было в объекте плюс то, что вы добавили тестируемым методом append. То есть правильный тест должен оперировать публичными методами класса.
Допустим вы пошли другим путем и каким-то образом достучались до приватных членов класса через рефлексию или еще как-нибудь. Теперь вы тестируете метод append анализируя как изменяется внутреннее хранилище объекта. С виду ничего не изменилось. Если кто-то полез в реализацию метода append и метод стал работать неверно, то ваш тест завалится, как вам и требуется. Но допустим вы сами или кто-то еще решил изменить реализацию внутреннего хранилища строки. Может он переименовал поле, может теперь таких полей несколько, а может он вообще перенес хранилище в облако и теперь оно хранится где-то на других серверах. Не важно. Важно то, что при этом метод toString после вызова append возвращает именно то, что ожидается. Но при этом ваш тест завалится. То есть все работает правильно, а тест завалился! Поэтому, при написании теста, нужно оперировать только публичными методами.

Комментариев нет:

Отправить комментарий