Spring boot MockBean和MyBatis映射器不在一起工作(就像在SpringBoot2.2.7之前那样)

Spring boot MockBean和MyBatis映射器不在一起工作(就像在SpringBoot2.2.7之前那样),spring-boot,mybatis,spring-boot-test,spring-mybatis,Spring Boot,Mybatis,Spring Boot Test,Spring Mybatis,我使用的是MyBatis Spring Boot Starter 2.1.3版。自从迁移到SpringBoot2.2.7(我也尝试过2.2.8和2.3.1,结果相同)之后,我在使用MockBean注释模拟MyBatis接口(例如DAO)时遇到了一个问题。假设我有一个这样的界面: @Mapper @Repository public interface OrderDAO { int insertOrder(@Param("order") Order order); } 我想在我的Order

我使用的是MyBatis Spring Boot Starter 2.1.3版。自从迁移到SpringBoot2.2.7(我也尝试过2.2.8和2.3.1,结果相同)之后,我在使用MockBean注释模拟MyBatis接口(例如DAO)时遇到了一个问题。假设我有一个这样的界面:

@Mapper
@Repository
public interface OrderDAO {
   int insertOrder(@Param("order") Order order);
}
我想在我的OrderService中执行一个集成测试并模拟这个映射器,它包含OrderDAO类型的字段

我的集成测试用@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的调用显然不起作用,因为我的mock没有被注入到我的OrderService类中。现在,非常奇怪的是,我发现添加此代码可以让一切正常工作:

@TestConfiguration
static class MockConfig {
    @Bean
    public OrderDAO orderDAO() {
        return Mockito.mock(OrderDAO.class);
    }
}
在集成测试类上添加这个嵌套类以及ContextConfiguration注释,现在注入OrderService类的对象是MockitoMock——测试类中MockBean注释字段引用的同一个对象。我不必在SpringBoot1.2.6和更早版本中这样做,我也找不到任何可能导致这种情况的变更的参考(尽管我可能没有搜索足够长的时间)


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

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

@MockBean(name = "orderDAO")
private OrderDAO orderDAO;

你能提供一个类似的服务吗?我不太确定我是否能回答,但我相信这会帮助那些愿意帮助的人。我理解。我看看能否在接下来的几天内创建这个。谢谢你的建议。好的,我在这里创建了这个项目:我找到了一个解决方法。如果明确指定了bean名称,即
@MockBean(name=“userDAO”)
,则测试通过。我还在调查迈巴蒂斯那边是否有合适的解决方案。当然。我现在在那里制造问题。谢谢你调查这件事。您应该尝试新版本。:)