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 类。感谢任何人可以提供的任何见解。谢谢。
正如 ave 在评论中提到的,我必须将名称添加到模拟 bean 注释中才能使其正常工作
@MockBean(name = "orderDAO")
private OrderDAO orderDAO;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
872 次 |
最近记录: |