Как смоделировать поле в суперклассе с помощью Mockito?

У меня есть MyClass, в котором есть поле MyService myService.

Теперь я тестирую класс, расширяя его. то есть MyClassTest extends MyClass.

Мой вопрос в том, как мне сказать Mockito издеваться над myService?

Спасибо

Зачем вам тестировать класс, расширяющий его? Во всяком случае, единственный способ, который я вижу, - это передать зависимость (издевательский сервис) конструктору базового класса с супер.

burm87 08.04.2019 18:02

Как вы инициализируете это поле? Можете ли вы присвоить значение с помощью сеттера?

Pavel Smirnov 08.04.2019 18:04

@PavelSmirnov, в основном это @Autowired. Я мог бы добавить сеттер или более подходящий, другой ctor()

yaseco 08.04.2019 18:06

@ burm87, я делаю это, потому что большинство методов являются приватными. Кто-то может возразить, что это плохой дизайн. Я мог бы согласиться на это

yaseco 08.04.2019 18:07

Вы говорите @Autowired. Это в Spring или Spring Boot? Вы можете предоставить макет контексту Spring с помощью @MockBean и запустить тест, используя @RunWith(SpringRunner.class) и @SpringBootTest. Или вы можете сделать автопроводку через ctor, а не прямо на поле.

David Conrad 08.04.2019 18:21

Вы должны предоставить свернутый пример, описывающий эти два класса и конфигурацию вашего теста, как один тест. Например: мне интересно, как расширение класса помогает тестировать частные методы. Ответы, которые вы уже получили, могут сработать, но, может быть, вопрос также может быть более полезным?

pirho 08.04.2019 19:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
2 338
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если это поле недоступно извне, у вас есть два варианта: отражение и... отражение.

Пример 1: используя org.mockito.internal.util.reflection.FieldSetter.

MyClass m = new MyClass();
FieldSetter.setField(m, m.getClass().getDeclaredField("myService"), yourService);

Пример 2: стандартное отражение Java:

MyClass m = new MyClass();
Field f = m.getClass().getDeclaredField("myService");
f.setAccessible(true);
f.set(m, yourService);

Вы можете издеваться над сервисом, как показано ниже.

Это импорт, который вы должны иметь

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Вот тест

MyClass myClass = new MyClass();

// Mock the service
MyService myService = mock(MyService.class);
// Write the behavior of the mocked service.
when(myService.myMethod()).thenReturn(someOutputObjectThatShouldBeReturned)

// Set the mocked service to your class.
Whitebox.setInternalState(myClass, "myService", myService)

Другие вопросы по теме