Java Mockito测试失败:实际上,与此模拟没有任何交互

Java Mockito测试失败:实际上,与此模拟没有任何交互,java,hibernate,junit,powermock,powermockito,Java,Hibernate,Junit,Powermock,Powermockito,只是想问一下,因为我被困在测试用例中,得到的错误是“实际上,这个模拟没有任何交互” 我已经创建了一个Dao实现类,它正在执行CRUD操作 public class EmployeeDaoImpl implements EmployeeDao { @Override public void saveEmployee(EmployeeDetails employee) { Session session = HibernateUtil.getS

只是想问一下,因为我被困在测试用例中,得到的错误是“实际上,这个模拟没有任何交互”

我已经创建了一个Dao实现类,它正在执行CRUD操作

public class EmployeeDaoImpl implements EmployeeDao {
       @Override
        public void saveEmployee(EmployeeDetails employee) {

            Session session = HibernateUtil.getSessionFactory().openSession();
            Transaction transaction = session.beginTransaction();
            session.save(employee); 
            transaction.commit();
            session.close();

        }
    }
对于上面的这个类,我正在使用Mockito构建测试。因此,对于我上面的saveEmployee方法会话,事务我将其作为模拟对象,现在我需要检查会话保存方法以及事务

因此,我编写了以下Mockito代码:

/** * */


我已经调试了代码,代码将传递到IDE中的所有断点,当我执行此操作时,3个值将被添加到数据库中,但我的测试用例将失败,因为没有交互。

测试中的会话模拟与EmployeeDaoImpl#saveEmployee中使用的对象不同

使用会话参数实现EmployeeDaoImpl的构造函数,并在saveEmployee()方法中使用该参数。这允许@InjectMock按预期工作

@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    Session session;

    @InjectMocks
    EmployeeDaoImpl edi;

    @Test
    public void testSaveEmployee(){
        edi.saveEmployee();

        verify(session, times(1)).save();
    }
}

class Session {
    void save() {
        System.out.println("saving");
    }
}

interface EmployeeDao {
    void saveEmployee();
}

class EmployeeDaoImpl implements EmployeeDao {
    private Session session;

    public EmployeeDaoImpl(Session session) {
        this.session = session;
    }

    @Override
    public void saveEmployee() {
        session.save();
    }
}

感谢兄弟解释我,但我需要添加到这个交易,我会尝试这样做。还有一件事是HibernateUtil.getSessionFactory().openSession();是静态的,我想我们不能使用任何我可以使用的方法@luc14n0@SandeepV您可以浏览PowerMockito库来模拟静态方法
@RunWith(MockitoJUnitRunner.class)
public class MockitoTest {

    @Mock
    Session session;

    @InjectMocks
    EmployeeDaoImpl edi;

    @Test
    public void testSaveEmployee(){
        edi.saveEmployee();

        verify(session, times(1)).save();
    }
}

class Session {
    void save() {
        System.out.println("saving");
    }
}

interface EmployeeDao {
    void saveEmployee();
}

class EmployeeDaoImpl implements EmployeeDao {
    private Session session;

    public EmployeeDaoImpl(Session session) {
        this.session = session;
    }

    @Override
    public void saveEmployee() {
        session.save();
    }
}