Как вставить макет в поле @Autowired в абстрактном родительском классе с помощью Mockito

Я пишу модульный тест для класса, который имеет абстрактный суперкласс, и одна из функций в ChildClass вызывает метод объекта из BaseClass.

ChildClass выглядит примерно так.

public class ChildClass extends ParentClass {
    public void functionA(){
        objectFromParentClass.functionB();
    }
}

Родительский класс

public abstract class ParentClass {
    @Autowired
    protected typeFromParentClass objectFromParentClass;

    public void someFunction() {}
}

Поскольку родительский класс является абстрактным, @InjectMocks и ReflectionTestUtils () не работает. Есть ли способ вставить издеваемый objectFromParentClass в ParentClass с помощью Mockito?

Изменить: ни ребенок, ни родительский класс не были написаны мной, я просто тестирую его.


person Domonkos Kertész    schedule 03.06.2020    source источник
comment
создайте геттер / сеттер в родительском классе и в своем тестовом классе добавьте аннотации Spy (чтобы геттер возвращал макет) + InjectMocks   -  person Evgeniy    schedule 03.06.2020


Ответы (2)


ReflectionTestUtils.setField() действительно работает в этом случае

person Domonkos Kertész    schedule 03.06.2020

https://github.com/exabrial/mockito-object-injection

Вот расширение Junit5, которое мы написали для решения именно этой проблемы. По сути, он берет карту объектов и вставляет их в поля тестируемого класса. Идеально подходит там, где InjectMocks не оправдывает ожиданий!

person Jonathan S. Fisher    schedule 03.06.2020