2017-01-19 8 views
1

테스트 케이스에 걸려있어 오류가 발생하여 "실제로이 모의 객체와의 상호 작용이 없었습니다."라는 질문을 받고 싶습니다.Mockito 테스트 실패 : 실제로이 모의 객체와의 상호 작용이 없습니다.

나는 CRUD 작업을 수행하는 Dao 구현 클래스를 만들었습니다.

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 메소드 Session에 TRANSaction을 Mock 객체로 만들었습니다. 이제는 세션, 및 트랜잭션을 확인해야합니다.

그래서 내가 쓴 아래의 Mockito 코드 : 내가 코드를 디버깅하고 코드가 모든 내 IDE에서 브레이크 포인트에 통과

/** * */

package sandeep.test; 

import static org.junit.Assert.*; 

import javax.transaction.HeuristicMixedException; 
import javax.transaction.HeuristicRollbackException; 
import javax.transaction.RollbackException; 
import javax.transaction.SystemException; 
import javax.transaction.Transaction; 

import junit.framework.Assert; 

import org.hibernate.Session; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.Mockito; 
import org.mockito.runners.MockitoJUnitRunner; 

import sandeep.DAO.EmployeeDao; 
import sandeep.DAOImpl.EmployeeDaoImpl; 
import sandeep.DAOImpl.HibernateUtil; 
import sandeep.pojo.EmployeeDetails; 
import static org.mockito.Mockito.*; 


/** 
* @author sandeep 
* 
*/ 
@RunWith(MockitoJUnitRunner.class) 
public class EmployeeDaoImplTest { 

    @Mock 
    EmployeeDetails edt; 
    @Mock 
    Session session ; 
    @Mock 
    Transaction transaction; 

    @InjectMocks 
    EmployeeDaoImpl edi = new EmployeeDaoImpl(); 

    @Before 
    public void setUp() throws Exception { 
     //eimpl = new EmployeeDaoImpl(); 
     //emp= mock(EmployeeDao.class); 
    } 

    @After 
    public void tearDown() throws Exception { 
    } 

    @Test 
    public void testSaveEmployee(){ 
     edi.saveEmployee(getEmployeeDetails()); 
     // But here i am getting the error as zero interactions 
     verify(session, times(1)).save(EmployeeDetails.class); 
    } 

    public EmployeeDetails getEmployeeDetails(){ 

     edt = new EmployeeDetails(); 
     edt.setEname("sandeep"); 
     edt.setId(2); 
     edt.setEnumber("hoi"); 
     return edt; 

    } 
} 

이 값을 3 번 실행하면 데이터베이스에 추가되지만 상호 작용이 없으므로 테스트 케이스가 실패합니다.

답변

1

테스트의 세션 모의는 세션 인수 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(); 
    } 
} 
+0

나를 설명 해주셔서 감사합니다.하지만이 작업을 수행하려고하는 트랜잭션을 추가해야합니다. 한가지 더 있습니다 HibernateUtil.getSessionFactory(). openSession(); 정적이고 나는 우리가 사용할 수있는 어떤 방법이라도 사용할 수있는 Mockito를 사용하지 않을 것 같아 @ luc14n0 –

+0

@SandeepV PowerMockito 라이브러리를 탐색하여 정적 메소드를 모방 할 수있다. –