首页 > 解决方案 > @Transactional 注解覆盖了 Mockito 的 InjectMocks

问题描述

在类 TeacherDao 方法 create() 调用 AddressDao.create():

public void create(Teacher teacher) {
    addressDao.create(teacher.getAddress());
    // Teacher is being written to database...
}

我正在为 TeacherDao 类编写 Junit5 测试,因此 AddressDao 被替换为模拟。我调用 TeacherDao.create() 并验证 AddressDao.create() 正在交互:

@Mock
private AddressDao addressDao;
@InjectMocks
@Autowired
private TeacherDao teacherDao;
@Test
void teacherDaoCreateTest() {
     teacherDao.create(teacher);
     verify(addressDao).create(testAddress);
}

验证成功。之后,我将 @Transactional 注释添加到 TeacherDao.create() 方法,测试失败。AddressDao 模拟现在具有零交互,并且 testAddress 实际上正在写入数据库。我不完全理解 @Transactional 是如何深入工作的,而且一定遗漏了一些重要的东西。为什么@Transactional 重写模拟?

标签: javatransactionsmockitojunit5

解决方案


我认为您应该删除 @Autowired 注释。


推荐阅读