Пример использования @MockBeans - PullRequest
1 голос
/ 14 мая 2019

У меня есть класс контроллера, который использует несколько сервисов.Я пишу тест для этого контроллера, например:

@RunWith(SpringRunner.class)
@WebMvcTest(value = PurchaseController.class, secure = false)
public class PurchaseControllerTest {

    @MockBean
    private ShoppingService shoppingService;

    @MockBean
    private ShopRepository shopRepository;

    @MockBean
    private SomeOtherRepository someOtherRepository;

    @Autowired
    private MockMvc mockMvc;

// ... some tests goes here

Дело в том, что таких макетов, как правило, много, а значит, и строк кода.Я знаю, что это может быть признаком запаха кода, но это не моя точка зрения.

Я заметил, что есть также аннотация @MockBeans, которая имеет @Target(ElementType.TYPE).Поэтому я подумал, что мог бы попробовать:

@RunWith(SpringRunner.class)
@WebMvcTest(value = PurchaseController.class, secure = false)
@MockBeans(value = {ShoppingService.class, ShopRepository.class})
public class PurchaseControllerTest {

, но это не скомпилирует событие.

Мой вопрос: как мы могли бы использовать @MockBeans аннотацию?Это применимо к моему делу?

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Javadoc говорит, что он используется как

Контейнерная аннотация, объединяющая несколько аннотаций {@link MockBean}.

Таким образом, вы можете написать

@MockBeans({@MockBean(ShoppingService.class), @MockBean(ShopRepository.class)})
public class PurchaseControllerTest {

@Autowire ShoppingService работает здесь

Или

Может также использоваться вместе с поддержкой Java 8 для повторяющихся аннотаций

@MockBean(ShoppingService.class)
@MockBean(ShopRepository.class)
public class PurchaseControllerTest {

Java 8 включает повторяющиеся аннотации , и по соображениям совместимости повторяющиеся аннотации хранятся в контейнерной аннотации @MockBeans, которая автоматически генерируется компилятором Java.Чтобы компилятор сделал это, вам понадобятся 2 вещи:

  • Повторяемые @Repeatable(MockBeans.class) Тип аннотации @MockBean
  • Содержащий тип аннотации @MockBeans
2 голосов
/ 14 мая 2019

@MockBeans это просто повторяемая аннотация для умножения @MockBean с. Если вам нужно повторно использовать этот смоделированный bean-компонент, вы можете добавить его в класс / config. Но вам нужно использовать @Autowired для сервисов, которые вам над чем издеваться. Так что в вашем случае это должно быть:

.....
@MockBeans({@MockBean(ShoppingService.class), MockBean(ShopRepository.class)})
public class PurchaseControllerTest {
  @Autowired
  ShoppingService shoppingService;
  @Autowired
  ShopRepository shopRepository;
.....
}

Основная идея @MockBeans это просто повторение @MockBean в одном месте. Для меня это может быть полезно только для некоторой конфигурации / общего класса, который вы можете использовать повторно.

@MockBean - создать макет, @Autowired - это бин с автосвязью из контекста, в вашем случае он помечает / создает бин как смоделированный, после чего имитированный бин будет внедрен в ваше поле с автопроводкой.

Так что, если у вас есть много полей с автоматическим связыванием с @MockBeans (или умножить @MockBean), вы можете настроить, если это макет или нет в одном месте (в @MockBeans для уровня класса), и вам не нужно замените @Autowired на @Mock в своем тестовом классе (как в случае, если вы удалите @MockBeans, все немодифицированные bean-компоненты будут автоматически подключены как bean-компоненты из контекста, и если вы отмените удаление, вы будете работать в mocked bean-компонентах ( что вы настроили внутри этой аннотации)).

Если вы хотите избежать большой зависимости внутри одного класса, вы можете извлечь всю зависимость в некоторый родительский класс, но поскольку java не поддерживает множественное наследование для класса, это не всегда может помочь.

0 голосов
/ 15 мая 2019

Самый короткий вариант в вашем случае - @MockBean, который поддерживает несколько значений требуемых классов насмешек

@MockBean({ShoppingService.class, ShopRepository.class})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...