Это мой класс, который должен быть протестирован:Как издеваются Hibernate Query.list() с помощью Mockito
@Repository
@Transactional
public class ProductDAOImpl implements ProductDAO {
private static final Logger logger = Logger.getLogger(ProductDAOImpl.class);
@Autowired
private SessionFactory hibernateSessionFactory;
@Override
public ProductDTO getProduct(String isbn) throws ProductException {
ProductDTO productDTO = new ProductDTO();
Product product = getProductFromDb(isbn);
BeanUtils.copyProperties(product, productDTO);
return productDTO;
}
private Product getProductFromDb(String isbn) throws ProductException{
Session session = this.hibernateSessionFactory.getCurrentSession();
String hql = "FROM com.esp.dao.entity.Product P WHERE P.isbn13 = :isbn13";
Query query = session.createQuery(hql);
query.setParameter("isbn13",isbn);
List<Product> productList = query.list(); // Want to mock this call
if(productList.size() ==1)
return productList.get(0);
else if(productList.size() >1)
// throw new ProductException("Cannot return product. Multiple products found.", HttpServletResponse.SC_NOT_FOUND);
throw new ProductException("Cannot return product. Multiple products found.");
else if(productList.size() == 0){
throw new ProductException("Cannot return product. No products found.");
}
return null;
}
Я хочу дразнить query.list() метод. Это то, что я пробовал до сих пор, но получаю исключение: Тип «SessionFactory» - это интерфейс, и его нельзя отслеживать.
@RunWith(MockitoJUnitRunner.class)
public class TestProductDaoImpl {
@Spy
private SessionFactory hibernateSessionFactory;
@InjectMocks
private ProductDAOImpl productDAOImpl;
@Test
public void testGetProduct() throws ProductException {
Session session = this.hibernateSessionFactory.getCurrentSession();
String hql = "";
Query query = session.createQuery(hql);
Query spy = Mockito.spy(query);
List<Product> productList = getProductList();
doReturn(productList).when(spy).list();
productDAOImpl.getProduct("abc");
}
Я могу дразнить getProductFromDb(). Но в этом случае нет необходимости писать тестовый пример для этого, поскольку высшая часть класса получает издевательство.
Я прошу прощения. Я только что редактировал мой вопрос. Мне нужно высмеять метод Query.list(). Для этого в моем тестовом классе мне нужно создать действительный объект запроса и затем издеваться над ним. Но здесь я не могу издеваться над объектом Query. – Ajit
@Sumit Pal. У вас нет ошибки. «Тип« SessionFactory »- это интерфейс, и его нельзя проверять на« и проблема только с «query.list()»? –
У меня есть эта ошибка. Применяя решение 1, он решил & теперь я получаю NullPointerException в строке session.createQuery (hql); – Ajit