Дразнить боб в контексте Spring
Я хочу проверить боб Spring A, конечно, этот боб является частью
контекст, и он использует другие компоненты для выполнения операций.
В контексте есть конкретный компонент B, который я хочу смоделировать для этого теста, и обратите внимание, что B не вводится в A (я мог бы легко обработать этот случай с помощью @InjectMocks
а также @Mock
аннотации), B вводится в C, который вводится в D, который вводится в A.
Могу ли я издеваться только над В во время тестирования класса А? Как вы можете сделать это?
2 ответа
Предполагая, что тестовый класс помечен @RunWith(MockitoJUnitRunner.class)
Вы можете попробовать это:
@Mock
private B b;
@InjectMocks
@Spy
private C c = new C();
@InjectMocks
@Spy
private D d = new D();
@InjectMocks
private A a = new A();
Быстрое объяснение: B будет издеваться. C и D будут созданы с использованием новых (здесь не издеваться, поэтому мы помечаем @Spy
). @InjectMocks
будет вводить B в C, C в D и D в A. Надеюсь, это поможет. Более полный пример доступен в этом моем коде (просто пример кода приложения) здесь. Обратите внимание, как реальные объекты и макетные объекты вводятся в одном классе.
Если вы используете SpringRunner
Другим способом является:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {A.class, Bmock.class, C.class, D.class})
где Bmock.class
это макет, который вы уже создали где-то в вашем проекте. Этот подход также предполагает, что у вас есть правильно разделенные интерфейсы и реализации: он будет работать, только если вы автоматически подключите интерфейс B в D, а не конкретный класс B.
Вот так выглядят ваши зависимости -
B -> C -> D -> A
Так как вы хотите протестировать Bean A, единственное, что вы хотели бы посмеяться, это D
и не должен беспокоиться о том, что что D
необходимо. Мокито сделает всю работу за вас.
Если для тестирования A
, вы хотите смоделировать все зависимости, как B
а также C
, вы делаете это не правильно.