小编Dav*_*ehl的帖子

MockBean 和 MyBatis Mapper 不能一起工作(就像他们在 Spring Boot 2.2.7 之前所做的那样)

我使用的是 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);
}
Run Code Online (Sandbox Code Playgroud)

我想在包含 OrderDAO 类型的字段的 OrderService 中执行集成测试并模拟此映射器。

我的集成测试用 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 注释并包含以下字段:

@MockBean
private OrderDAO orderDAO;
Run Code Online (Sandbox Code Playgroud)

当我运行这样的测试并查看对 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

添加这个嵌套类以及在集成测试类上添加 ContextConfiguration 注释,现在注入到 OrderService 类中的对象是 MockitoMock —— 与测试类中的 MockBean …

mybatis spring-boot spring-mybatis spring-boot-test

5
推荐指数
1
解决办法
872
查看次数