我使用的是 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 …