Java 如何为持久化和刷新异常编写单元测试

Java 如何为持久化和刷新异常编写单元测试,java,unit-testing,persistence,Java,Unit Testing,Persistence,我有以下代码: try { em.persist(myObject); em.flush(); } catch (Exception e) { System.out.println("An Exception occur when trying to persist and flush"); } 在测试中,我用Mockito模拟了我的EntityManager: @Mock EntityManager mockEm; 但由于persist和flush是无效的方法,我无法编

我有以下代码:

try {
  em.persist(myObject);
  em.flush();
}
catch (Exception e) {
  System.out.println("An Exception occur when trying to persist and flush");
}
在测试中,我用Mockito模拟了我的EntityManager:

    @Mock
EntityManager mockEm;
但由于persist和flush是无效的方法,我无法编写如下内容:

when(mockEm.persist(anObject).then(doSomeThing);
我如何编写单元测试(使用JUnit)来模拟em.persist和em.flush,以便测试这两种情况是否有异常?
谢谢。

我想我们需要更多的细节。现在,您可以这样做:(这是一种伪代码)

@Test//当存储库中有一个对象时它就通过了(我假设你有干净的内存数据库)
public void shouldPersistMyObject()引发异常{
em.persist(myObject);
em.flush();
Assert.assertThat(dao.findAll(),Matchers.equalTo(1));
}
@Test(预期=.class)//如果抛出,则测试通过
当保存损坏的数据()时,公共无效应通过例外{
//在某些@NotNull值上设置NULL,然后保存,如:
myObject.setUserId(null);
em.save(myObject);//引发异常
}

我想我们需要更多的细节。现在,您可以这样做:(这是一种伪代码)

@Test//当存储库中有一个对象时它就通过了(我假设你有干净的内存数据库)
public void shouldPersistMyObject()引发异常{
em.persist(myObject);
em.flush();
Assert.assertThat(dao.findAll(),Matchers.equalTo(1));
}
@Test(预期=.class)//如果抛出,则测试通过
当保存损坏的数据()时,公共无效应通过例外{
//在某些@NotNull值上设置NULL,然后保存,如:
myObject.setUserId(null);
em.save(myObject);//引发异常
}

这个答案不能简单地回答。您到底想测试什么-在
persist()/flush()
中发生了什么-还是只想验证这两个方法是否在
em
对象上被调用?我想测试persist或flush何时返回EntityExistException或PersistenceException之类的异常。在这种情况下,我的代码将捕获异常,我想测试代码是否真的捕获并执行相应的代码。然后你可能想模拟em对象,让它在调用这些方法时抛出异常。是的。我能为谁效劳?首先,你想更新你的问题,在那里添加那条信息。认真更新你的问题。而不是在评论中给出随机的回答,忽略你已经收到的反馈。这个答案不能简单地回答。您到底想测试什么-在
persist()/flush()
中发生了什么-还是只想验证这两个方法是否在
em
对象上被调用?我想测试persist或flush何时返回EntityExistException或PersistenceException之类的异常。在这种情况下,我的代码将捕获异常,我想测试代码是否真的捕获并执行相应的代码。然后你可能想模拟em对象,让它在调用这些方法时抛出异常。是的。我能为谁效劳?首先,你想更新你的问题,在那里添加那条信息。认真更新你的问题。而不是在评论中随机回答,忽略你已经收到的反馈@Test public void myTest(){whenSorry注释使用不当。我重试:通常我编写的测试如下:
@Mock EntityManager mockEm;@Mock Query mockQuery;@InjectMocks MyClassToTest MyClassToTest;when(mockEm.createNamedQuery(“MyObject.findById”)。然后返回(mockQuery);when(mockQuery.setParameter(MyClassToTest.PARAM_ID,EXISTING_ID)).thenReturn(mockQuery);@Test public void testFindById()抛出异常{当(mockQuery.getSingleResult()).thenReturn(existingObject);MyObject result=MyClassToTest.findById(mockEmf,EXISTING_ID);assertEquals(existingObject,result);}
不要把这些信息放在评论中-而是更新你的问题。或者你能读一下你刚才放在那里的内容吗?通常我写我的测试像:'@Mock EntityManager mockEm;@test public void myTest(){whenSorry注释使用不当。我重试:通常我编写的测试如下:
@Mock EntityManager mockEm;@Mock Query mockQuery;@InjectMocks MyClassToTest MyClassToTest;when(mockEm.createNamedQuery(“MyObject.findById”)。然后返回(mockQuery);when(mockQuery.setParameter(MyClassToTest.PARAM_ID,EXISTING_ID)).thenReturn(mockQuery);@Test public void testFindById()引发异常{when(mockQuery.getSingleResult())。thenReturn(existingObject);MyObject结果=myClassToTest.findById(mockEmf,现有_ID);assertEquals(existingObject,结果);}
不要把这些信息放在评论中,而是更新你的问题。或者你能读一下你刚才放在那里的内容吗?
@Test // it passess when there's one object in repository (I assume u have clean memory db)
public void shouldPersistMyObject() throws Exception {
    em.persist(myObject);
    em.flush();
    Assert.assertThat(dao.findAll(), Matchers.equalTo(1));
}

@Test(expected = <YourDesiredException>.class) // if <YourDesiredException> is thrown, your test passes
public void shouldThrowExceptionWhenSavingCorruptedData() {
    //set NULL on some @NotNull value, then save, like:
    myObject.setUserId(null);
    em.save(myObject); //exception is thrown
}