我想为EntityManager编写junit,但无法模拟EntityManager。我的服务类方法如下:
@PersistenceContext
private EntityManager em;
public List<Items> getItems() {
Order order = Order.desc("ASC");
Criteria crit = em.unwrap(Session.class).createCriteria(Items.class);
Criteria critRowCount = em.unwrap(Session.class).createCriteria(Items.class);
crit.add(Restrictions.eq("createdBy", "John"));
critRowCount.add(Restrictions.eq("createdBy", "John"));
crit.setFirstResult((pageNo - 1) * pageSize);
crit.setMaxResults(pageSize);
crit.addOrder(order);
List<Items> items = crit.list();
critRowCount.add(Restrictions.sqlRestriction("Query"));
critRowCount.setProjection(Projections.rowCount()).uniqueResult();
return items;
}
我用在我的上一个例子:
@MockBean
private EntityManager em;
和当我在service
中调用以下方法时List<Items> items = crit.list();
这将击中DB。请帮我解决这个问题。
提前感谢!
我不知道为什么嘲弄不起作用(从您在这里展示的内容来看,我想说它应该起作用)。但我想建议另一种方法。我认为getItems()
方法存在于某种Repository或DAO中。对于单元测试,我通常会嘲笑它们。如果我想测试getItems()
,我实际上会尝试在集成测试中通过数据库(例如通过testcontainers)测试它,因为这无论如何都相当接近数据库。
在你的具体情况下,我可能甚至不会尝试测试getItems()
,因为它似乎只包含一些管道代码。
作为一个经验法则:嘲笑你不拥有的东西通常不是一个好主意。