2017-09-26 36 views
0

我有以下代碼:我怎麼能寫單元測試的堅持和沖洗例外

try { 
    em.persist(myObject); 
    em.flush(); 
} 
catch (Exception e) { 
    System.out.println("An Exception occur when trying to persist and flush"); 
} 

在測試我有模仿我的EntityManager用的Mockito:

@Mock 
EntityManager mockEm; 

但作爲堅持和沖洗是無效的方法,我不能寫類似的東西:

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

我如何寫單元測試(與JUnit)莫ck em.persist和em.flush爲了測試這兩種情況有無異常? 謝謝。

+0

此答案不能簡單回答。你想測試什麼 - 在**'persist()/ flush()'裏面發生了什麼** - 或者你只是想確認這兩個方法是在em對象上調用的嗎? – GhostCat

+0

我想測試何時持續或刷新返回像EntityExistException或PersistenceException異常。在這種情況下,我的代碼將捕獲異常,並且我想測試該代碼確實捕獲並執行相應的代碼。 –

+0

然後,你可能想*模擬*這個em對象,並在調用這些方法時拋出一個異常。 – GhostCat

回答

0

我想我們需要更多的細節。現在,你可以做這樣的事情:(這是一種僞代碼)。

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

通常我寫了我的測試: '@Mock EntityManager mockEm; @Test public void myTest(){ –

+0

對不起使用評論。 我再試一次: 通常我寫了我的測試: '@Mock EntityManager mockEm; @Mock 查詢mockQuery; @InjectMocks MyClassToTest myClassToTest; when(mockEm.createNamedQuery(「MyObject.findById」)) .thenReturn(mockQuery); when(mockQuery.setParameter(MyClassToTest.PARAM_ID,EXISTING_ID)) .thenReturn(mockQuery); (mockQuery.getSingleResult())。thenReturn(existingObject);方法將拋出異常{ } MyObject result = myClassToTest.findById(mockEmf,EXISTING_ID); assertEquals(existingObject,result); }' –

+0

不要將這些信息放入註釋 - 而是更新您的問題。或者你可以閱讀你剛剛放置的東西嗎? – GhostCat