2016-07-14 5 views
1

Это мой класс, который должен быть протестирован:Как издеваются 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(). Но в этом случае нет необходимости писать тестовый пример для этого, поскольку высшая часть класса получает издевательство.

ответ

3

На мой взгляд, есть два подхода:

Первое: Создать макет на SessionFactory как этот

@Mock 
private SessionFactory hibernateSessionFactory; 

@Before 
public void beforeTest(){ 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void testGetProduct() throws ProductException { 
    //then mock all you need from hibernateSessionFactory 
    Session session = Mockito.mock(Session.class); 
    Query query = Mockito.mock(Query.class); 

    Mockito.when(hibernateSessionFactory.getCurrentSession()).thenReturn(session); 
    Mockito.when(session.createQuery("FROM com.esp.dao.entity.Product P WHERE P.isbn13 = :isbn13")).thenReturn(query); 

    List<Product> productList = new ArrayList<>(1); 
    Mockito.when(query.list()).thenReturn(productList); 

Второй: Вы должны создать экземпляр SessionFactory

private SessionFactory hibernateSessionFactory; 

@Before 
public void beforeTest(){ 
    hibernateSessionFactory = Mockito.spy(new ConstructorForSessionFactory()); 
} 
+0

Я прошу прощения. Я только что редактировал мой вопрос. Мне нужно высмеять метод Query.list(). Для этого в моем тестовом классе мне нужно создать действительный объект запроса и затем издеваться над ним. Но здесь я не могу издеваться над объектом Query. – Ajit

+0

@Sumit Pal. У вас нет ошибки. «Тип« SessionFactory »- это интерфейс, и его нельзя проверять на« и проблема только с «query.list()»? –

+0

У меня есть эта ошибка. Применяя решение 1, он решил & теперь я получаю NullPointerException в строке session.createQuery (hql); – Ajit