我有一个class:
public class ProductComercialOrderDAO extends BaseDao implements ProductComercialOrderDAOLocal {
private final static Logger log = UtilsBusiness.getLog4J(ProductComercialOrderDAO.class);
public Session getSession() throws DAOServiceException{
return super.getSession();
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void createProductComertialOrder(ProductComertialOrder pcom) throws DAOServiceException, DAOSQLException {
log.debug("== Init createProductComertialOrder/ProductComercialOrderDAO ==");
Session session = this.getSession();
try {
session.save(pcom);
this.doFlush(session);
} catch (Throwable ex) {
log.error("== Exception in ProductComertialOrder ==");
throw super.manageException(ex);
} finally {
log.debug("== createProductComertialOrder/ProductComercialOrderDAO End ==");
}
}
}
我需要模拟这个方法:
public Session getSession() throws DAOServiceException{
return super.getSession();
}
用于在jUnit测试阶段替换Hibernate数据源。
我有这个代码与Mockito:
package dao;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import java.util.Date;
import javax.ejb.EJB;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import co.com.myapp.sdii.exceptions.DAOSQLException;
import co.com.myapp.sdii.exceptions.DAOServiceException;
import co.com.myapp.sdii.model.pojo.ProductComercialOrder;
import co.com.myapp.sdii.persistence.dao.core.impl.ProductComercialOrderDAO;
import co.com.myapp.sdii.persistence.hibernate.HibernateUtil;
public class ProductComercialOrderDAOTest {
public ProductComercialOrderDAO prodcomDao;
private ProductComercialOrder prodCom;
SessionFactory sessionFact = null;
Session session = null;
@Test
public void setUp() throws DAOServiceException, DAOSQLException{
sessionFact = util.HibernateUtil.getSessionFactory();
sessionFact.openSession();
session = sessionFact.getCurrentSession();
prodCom = new ProductComercialOrder();
prodCom.setCreationDate(new Date());
prodCom.setCreationUser("user1");
prodCom.setId(1L);
prodCom.setPrdCategory("Hardware");
prodCom.setPrdCategoryType("IRD");
prodCom.setOrderNum(1L);
if(prodcomDao == null){
prodcomDao = new ProductComercialOrderDAO();
}
Mockito.spy(ProductComercialOrder.class);
Mockito.when(prodcomDao.getSession()).thenReturn(session);
prodcomDao.createProductComercialOrder(prodCom);
}
}
但是当我呼叫:
prodcomDao.createProductComercialOrder(prodCom);
调用原始的ProductComercialOrderDAO.getSession()
,而不是我的mock。
如何模拟替代hibernate会话的方法?
你需要这样做Mockito.doReturn(session).when(prodcomDao).getSession()
以确保原始方法没有被调用。
见@akcasoy的回答Mockito - doReturn()和when()的区别