MockBean и MyBatis Mapper не работают вместе (как это было до Spring Boot 2.2.7) - PullRequest
3 голосов
/ 16 июня 2020

Я использую 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. Цените любую информацию, которую может предоставить любой. Спасибо.

...