2015-07-03 120 views
0

我試圖找到解決方案,但尚未找到。我試圖測試公共方法,其中有私人調用的內部。私有方法通過泛型方法檢索Hibernate的Criteria的問題之一,該泛型方法依次通過另一個泛型方法鏈來檢索它。請看下面的代碼。坦率地說,我不知道它是可以測試這種情況下,但如果任何人有想法,請建議他們:Mockito - 調用私有方法的測試方法

ConcreteDao

public class ConcreteDao extends EntityDao<ConcreteEntity> { 

    public Class<ConcreteEntity> getClassType() { 
     return ConcreteEntity.class; 
    } 

} 

EntityDao

public abstract class EntityDao<T> extends AbstractDao<T>{ 

    public List<T> getEntityByFilter(EntityFilter filter) { 
     Criteria criteria = getCriteriaByFilter(filter.getFilters()); 
     criteria.setMaxResult(filter.getMaxResult()); 
     criteria.setFirstResult(filter.getFirstResult()); 
     criteria.addOrder(Order.asc(filter.getSortedField())); 
     criteria.list(); 
    } 

    private Criteria getCriteriaByFilter(List<CustFilter> filters) { 
     Criteria criteria = getCriteria(); 
     for (CustFilter filter : filters) { 
      filter.addrestrictionToCriteria(criteria, filter.getProperty(), filter.getValue()); 
     } 
     return criteria; 
    } 

} 

AbstractDao的

public abstract class AbstractDao<T> { 

    private EntityManagerFactory entityManagerFactory; 

    public abstract getClassType(); 

    public Criteria getCriteria() { 
     return getSession().createCriteria(getClassType()); 
    } 

    public Session getSession() { 
     Session session = (Session) getEntityManager().getDelegate(); 
     return session; 
    } 

    public EntityManager getEntityManager() { 
     entityManagerFactory.getEntityManager(); 
    } 

} 

測試類

@RunWith(MockitoJUnitRunner.class) 
public class ConcreteDaoTest { 

    @Mock 
    private EntityManager entityManager; 

    @Mock 
    private Session session; 

    @Mock 
    private Criteria criteria; 

    private List<CustFilter> filters; 

    private EntityFilter entityFilter; 

    private List<ConcreteEntity> resultList; 

    @InjectMocks 
    private ConcreteDao concreteDao = new ConcreteDao; 

    public void init() { 
     filters = new ArrayLis<CustFilter>(); 
     CustFilter custFilter = new CustFilter(); 
     //fill filter; 
     filters.add(custFilter); 

     entityFilter = new EntityFilter(); 
     //fill entityFilter 
     entityFilter.setFilters(filters); 

     ConcreteEntity concreteEntity = new ConcreteEntity(); 
     resultList = new ArrayList<ConcreteEntity>(); 
     resultList.add(concreteEntity); 

    } 


    @Test 
    public void getEntityByFilterTest() { 
     when(concreteDao.getEntityManager).thenReturn(entityManager); 
     when(concreteDao.getSession()).thenReturn(session); 
     when(concretedao.getCriteria()).thenReturn(criteria); 

     when(filter.getFilters()).thenReturn(filters); 
     when(filter.getMaxResult()).thenReturn(10); 
     when(filter.getFirstResult()).thenReturn(0); 
     when(filter.getSortedField()).thenReturn("firstName"); 
     when(criteria.list()).thenReturn(resultList); 

     List<ConcreteEntity> result = concreteDao.getEntityByFilter(entityFilter); 
     Assert.assertThen(result. is(notNullValue())); 
    } 

} 
+0

如果您試圖模擬私人方法,您設計類的方式可能會有所修改 – kuhajeyan

+0

我同意你的意見,但我必須覆蓋已經存在的代碼。我不可能改變方法的訪問修飾符。 – aime

回答

1

用的Mockito,你不能嘲笑私有方法調用。 嘗試PowerMockito,您可以使用它來模擬任何類型的方法,如靜態方法,私有方法,本地方法實例化等等。

+0

我明白了。謝謝你的建議。 – aime