【问题标题】:How can I write Unit Test for persist and flush exceptions如何为持久化和刷新异常编写单元测试
【发布时间】:2017-09-26 13:59:12
【问题描述】:

我有以下代码:

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 是 void 方法,我无法编写如下内容:

when(mockEm.persist(anObject).then(doSomeThing);

我如何编写单元测试(使用 JUnit)来模拟 em.persist 和 em.flush,以便在有无例外的情况下测试这两种情况? 谢谢。

【问题讨论】:

  • 这个答案不能简单回答。您究竟想测试什么 - 内部 persist() / flush() 会发生什么 - 还是您只想验证这两个方法是否在 em 对象上调用?
  • 我想测试持久化或刷新何时返回 EntityExistException 或 PersistenceException 等异常。在这种情况下,我的代码将捕获异常,我想测试该代码是否真正捕获并执行相应的代码。
  • 那么你可能想要mock那个 em 对象并让它在调用这些方法时抛出一个异常。
  • 是的。我能做什么?
  • 首先您要更新您的问题以在此处添加该信息。 认真更新您的问题。而不是在 cmets 中给出随机响应并忽略您已经收到的反馈。

标签: java unit-testing persistence


【解决方案1】:

我想我们需要更多细节。现在,您可以执行以下操作:(这是一种伪代码)。

@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
}

【讨论】:

  • 通常我这样写测试:'@Mock EntityManager mockEm; @Test public void myTest() { 何时
  • 抱歉评论使用不当。我再试一次:通常我这样写测试:@Mock EntityManager mockEm; @Mock Query mockQuery; @InjectMocks MyClassToTest myClassToTest; when(mockEm.createNamedQuery("MyObject.findById")) .thenReturn(mockQuery); when(mockQuery.setParameter(MyClassToTest.PARAM_ID, EXISTING_ID)) .thenReturn(mockQuery); @Test public void testFindById() throws Exception { when(mockQuery.getSingleResult()).thenReturn(existingObject); MyObject result=myClassToTest.findById(mockEmf, EXISTING_ID); assertEquals(existingObject, result); }
  • 不要将此类信息放入 cmets - 而是更新您的问题。或者你能读一下你刚刚放在那里的东西吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2015-02-09
  • 2021-09-28
相关资源
最近更新 更多