Дразнить боб в контексте 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, вы делаете это не правильно.

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