Издевательское личное поле класса

1

У меня есть следующее поле в моем классе

@Resource(name = "lobIdCancellationNodeMap")
private Map<String, List<String>> lobIdCancellationNodeMap;

После этой строки мы получили прямой доступ к этому полю lobIdCancellationNodeMap

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

Вот как он используется

lobIdCancellationNodeMap.get(lobId)

Мне не разрешено изменять класс реализации

Теги:
powermock
mockito

2 ответа

1
Лучший ответ

Я решил эту проблему, используя класс ReflectionTestUtils, предоставленный Spring Framework, используя это, вы можете установить любое поле класса независимо от его модификатора доступа.

ReflectionTestUtils.setField(mapper, "lobIdCancellationNodeMap", lobIdCancellationNodeMap);
2

Хотя я согласен с примечаниями других пользователей, что кажется неправильным тестировать что-то, что не является публичным, у меня есть некоторое сочувствие к ситуации "Мне не разрешено изменять класс реализации".

Аннотирование @Resource предназначено для использования приложением для инъекции экземпляра во время выполнения. Я предлагаю вам настроить свои тесты с помощью контекста, аналогичного контексту вашего приложения во время выполнения. Таким образом, у этого класса будет введен его ресурс.

В противном случае вы могли бы использовать Reflection, чтобы установить значение в требуемое значение.

  • 0
    Если бы вы могли сделать поле защищенным, тогда ваш модульный тест мог бы установить его без доступа внешних классов. Я понимаю, что вы не можете изменить реализацию, но доступ к полям в целях тестирования - это не то же самое, что изменение API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню