У меня есть MyClass
, в котором есть поле MyService myService
.
Теперь я тестирую класс, расширяя его. то есть MyClassTest extends MyClass
.
Мой вопрос в том, как мне сказать Mockito издеваться над myService
?
Спасибо
Как вы инициализируете это поле? Можете ли вы присвоить значение с помощью сеттера?
@PavelSmirnov, в основном это @Autowired
. Я мог бы добавить сеттер или более подходящий, другой ctor()
@ burm87, я делаю это, потому что большинство методов являются приватными. Кто-то может возразить, что это плохой дизайн. Я мог бы согласиться на это
Вы говорите @Autowired
. Это в Spring или Spring Boot? Вы можете предоставить макет контексту Spring с помощью @MockBean
и запустить тест, используя @RunWith(SpringRunner.class)
и @SpringBootTest
. Или вы можете сделать автопроводку через ctor, а не прямо на поле.
Вы должны предоставить свернутый пример, описывающий эти два класса и конфигурацию вашего теста, как один тест. Например: мне интересно, как расширение класса помогает тестировать частные методы. Ответы, которые вы уже получили, могут сработать, но, может быть, вопрос также может быть более полезным?
Если это поле недоступно извне, у вас есть два варианта: отражение и... отражение.
Пример 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)
Зачем вам тестировать класс, расширяющий его? Во всяком случае, единственный способ, который я вижу, - это передать зависимость (издевательский сервис) конструктору базового класса с супер.