gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:11:32 32 4
gpt4 key购买 nike

我正在使用 MyBatis Spring Boot Starter 2.1.3 版。自从迁移到 Spring Boot 2.2.7(我也尝试了 2.2.8 和 2.3.1,结果相同)后,我在使用 MockBean 注释来模拟 MyBatis 接口(interface)(例如 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 的调用显然不起作用,因为我的模拟尚未注入(inject)我的 OrderService 类。现在,非常奇怪的是,我发现添加此代码可以使一切正常:
@TestConfiguration
static class MockConfig {
@Bean
public OrderDAO orderDAO() {
return Mockito.mock(OrderDAO.class);
}
}

添加这个嵌套类以及在集成测试类上添加 ContextConfiguration 注释,现在注入(inject) OrderService 类的对象是 MockitoMock —— 与测试类中的 MockBean 注释字段引用的对象相同。我不必对 Spring Boot 1.2.6 及更早版本执行此操作,并且我找不到任何可能导致此问题的更改的引用(尽管可能我搜索的时间不够长)。

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

最佳答案

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

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

关于spring-boot - MockBean 和 MyBatis Mapper 不能一起工作(就像他们在 Spring Boot 2.2.7 之前所做的那样),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62409666/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com