ИМО, следует избегать отражения везде, где это возможно . Конечно, есть ситуации, когда это необходимо, но в большинстве случаев это не стоит больших компромиссов с производительностью и безопасностью.
Во-вторых, и, возможно, более важно, если единственный способ тестирования фрагмента кода использовать отражение, тогда вам, вероятно, не нужно проверять его.
Рассмотрим следующий пример:
public class Message {
private String message;
public Message(Message message) {
this.message = message;
}
// NO GETTERS/SETTERS
}
Если бы я хотел проверить, что этот конструктор "работает", я мог бы написать тест, который использует отражение, чтобы заглянуть внутрь моего объекта и проверить, соответствует ли сообщение параметру конструктора. Но что в этом хорошего?
Предположительно, я хочу, чтобы этот класс сообщений каким-то образом использовался другим фрагментом кода. Как работает этот код? Я обнаружу, что мне, вероятно, нужен метод getMessage()
или что-то эквивалентное, чтобы сделать что-нибудь полезное с объектом.
В общем, использование отражения в модульном тестировании плохо, потому что тестирует базовую реализацию , а не поведение . Ваши модульные тесты не должны прерываться, когда кто-то приходит, например, реорганизует код для хранения данных на удаленном сервере.
Кроме того, я бы не стал перегружать тесты такими «тривиальными», как этот. Сосредоточьтесь на тестировании вашей бизнес логики c. Доверьтесь, что JVM в основном работает так, как рекламируется.