2017-01-19 18 views
1

私はテストケースにこだわっていて、エラーが"実際にはこのモックとの相互作用はありませんでした。Mockitoテストに失敗しました:実際には、このモックとの相互作用はゼロでした

私はCRUD操作を行っているDao Implementationクラスを作成しました。

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メソッドのセッション、TRansaction私はモックオブジェクトとしてそれを作ったとセッション、を保存すると同様にセッションを確認する必要があります。

だから私は書かれている以下の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

で使用したのと同じオブジェクトではありません。これにより、@ InjectMocksが意図したとおりに動作するようになります。

@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

私に説明していただきありがとうございますが、私はこれをやろうとするトランザクションを追加する必要があります。もう1つはここにありますHibernateUtil.getSessionFactory()。openSession();静的で、私は私が使用することができないと思うMockito私は@ luc14n0 –

+0

@SandeepVを使用することができます任意のメソッドを使用して静的メソッドを模擬するPowerMockitoライブラリを探索することができます –

関連する問題