Я использую MyBatis Spring Boot Starter версии 2.1.3. С тех пор, как я перешел на Spring Boot 2.2.7 (я также пробовал 2.2.8 и 2.3.1 с теми же результатами), у меня возникла проблема с использованием аннотации MockBean для имитации интерфейса MyBatis (например, DAO). Скажем, у меня есть такой интерфейс:
@Mapper
@Repository
public interface OrderDAO {
int insertOrder(@Param("order") Order order);
}
Я хотел бы выполнить интеграционный тест и смоделировать этот сопоставитель в моем OrderService, который содержит поле типа OrderDAO.
My интеграционный тест помечен @SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) и содержит это поле:
@MockBean
private OrderDAO orderDAO;
Когда я запускаю такой тест и смотрю, какие ссылки на объекты OrderDAO, в моем интеграционном тесте я вижу это:
com.example.dao.OrderDAO$MockitoMock$1819884459
Но внутри моего класса OrderService поле таково:
com.sun.proxy.$Proxy179 (org.apache.ibatis.binding.MapperProxy@37d9310e)
Итак, вызовы Mockito.verify явно не работают, потому что мой макет не был введен в мой класс OrderService. Как ни странно, я обнаружил, что добавление этого кода заставляет все работать:
@TestConfiguration
static class MockConfig {
@Bean
public OrderDAO orderDAO() {
return Mockito.mock(OrderDAO.class);
}
}
Добавление этого вложенного класса вместе с добавлением аннотации ContextConfiguration в тестовый класс интеграции, а теперь объект, который вводится в OrderService class - это MockitoMock - тот же объект, на который ссылается аннотированное поле MockBean в тестовом классе. Мне не приходилось делать это в Spring Boot 1.2.6 и более ранних версиях, и я не смог найти никаких ссылок на изменение, которое могло бы вызвать это (хотя, возможно, я недостаточно долго искал).
Итак, мне интересно, делаю ли я что-то неправильно или мне не хватает того, что я должен делать? Похоже, это должно работать так же, как и раньше, для чего нужен этот дополнительный вложенный класс TestConfiguration. Цените любую информацию, которую может предоставить любой. Спасибо.