如何为 EntityManager 事务编写单元测试?
How to write unit tests for EntityManager transaction?
我正在尝试为使用 EntityManager 更新数据库字段值的现有函数编写单元测试。我的单元测试应该验证 class 是否正确更新了值。当前代码如下所示:
public class MyClass {
MyClass(EntityManager em) {
this.em = em;
}
void updateValue() {
em.getTransaction().begin();
TypedQuery query = em.createQuery("select a from ...", MyResult.class);
List<MyResult> results = query.getResultList();
MyResult result = results.get(0);
result.setInterestingValue(1);
em.getTransaction().commit();
}
}
我目前的单元测试方法:
@Mock EntityManager em;
@Mock TypedQuery query;
publid void test() {
MyClass myClass = new MyClass(em);
MyResult result = new MyResult();
ArrayList<MyResult> resultList = new ArrayList<>();
resultList.add(result);
when(em.getTransaction()).thenReturn(mock(EntityTransaction.class));
when(em.createQuery(anyString(), any())).thenReturn(query);
when(query.getResultList()).thenReturn(resultList);
myClass.updateValue();
assertEquals(1, result.getInterestingValue());
}
我上面的单元测试验证 MyResult 实例已更新。但是,它不会验证该值是否实际通过 EntityManager 进行了更新。换句话说,我想测试现有代码中是否正确使用了 EntityManager。例如,即使我在 setInterestinvValue(1) 之前调用 commit(),我的测试仍然会通过。有什么好的测试方法吗?
如上所述,如果您使用 mockito,解决方案将是 - 使用 inOrder()
:
MyResult result = mock(MyResult.class);
EntityTransaction transaction = mock(EntityTransaction.class)
inOrder.verify(result).setInterestingValue(1);
inOrder.verify(transaction).commit();
我正在尝试为使用 EntityManager 更新数据库字段值的现有函数编写单元测试。我的单元测试应该验证 class 是否正确更新了值。当前代码如下所示:
public class MyClass {
MyClass(EntityManager em) {
this.em = em;
}
void updateValue() {
em.getTransaction().begin();
TypedQuery query = em.createQuery("select a from ...", MyResult.class);
List<MyResult> results = query.getResultList();
MyResult result = results.get(0);
result.setInterestingValue(1);
em.getTransaction().commit();
}
}
我目前的单元测试方法:
@Mock EntityManager em;
@Mock TypedQuery query;
publid void test() {
MyClass myClass = new MyClass(em);
MyResult result = new MyResult();
ArrayList<MyResult> resultList = new ArrayList<>();
resultList.add(result);
when(em.getTransaction()).thenReturn(mock(EntityTransaction.class));
when(em.createQuery(anyString(), any())).thenReturn(query);
when(query.getResultList()).thenReturn(resultList);
myClass.updateValue();
assertEquals(1, result.getInterestingValue());
}
我上面的单元测试验证 MyResult 实例已更新。但是,它不会验证该值是否实际通过 EntityManager 进行了更新。换句话说,我想测试现有代码中是否正确使用了 EntityManager。例如,即使我在 setInterestinvValue(1) 之前调用 commit(),我的测试仍然会通过。有什么好的测试方法吗?
如上所述,如果您使用 mockito,解决方案将是 - 使用 inOrder()
:
MyResult result = mock(MyResult.class);
EntityTransaction transaction = mock(EntityTransaction.class)
inOrder.verify(result).setInterestingValue(1);
inOrder.verify(transaction).commit();