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

Dav*_*ehl 5 mybatis spring-boot spring-mybatis spring-boot-test

我使用的是 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 注释字段引用的对象相同。我不必在 Spring Boot 1.2.6 及更早版本中执行此操作,并且我找不到任何可能导致此问题的更改的参考(尽管可能我搜索的时间不够长)。

所以,我想知道我是否做错了什么,或者,我是否错过了我应该做的事情?看起来这应该像以前一样工作,需要这个额外的嵌套 TestConfiguration 类。感谢任何人可以提供的任何见解。谢谢。

bba*_*rke 4

正如 ave 在评论中提到的,我必须将名称添加到模拟 bean 注释中才能使其正常工作

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

  • 您应该尝试新版本[2.1.4](https://github.com/mybatis/spring-boot-starter/releases/tag/mybatis-spring-boot-2.1.4)。:) (2认同)