2011-12-23 14 views
3

我在我的Java EE應用程序中設置了一個單元測試。我正在使用JPA,JSF,Netbeans和Glassfish。這也是我的第一個真正的Java應用程序,所以如果答案是愚蠢的明顯的話,請原諒我!如何在使用EJBContainer時在jUnit中獲得「真正的」異常而不是EJBException?

測試使用EJBContainer,訪問實體並嘗試輸入空記錄。然後它會嘗試輸入一個用戶名太短的記錄。 我想確認是否引發了適當的異常。

我可以添加@Test(expected=javax.ejb.EJBException.class)但這會捕獲容器可能拋出的任何異常。如果這不是我想知道的預期異常。 (同樣的理念作爲追趕的所有目的的異常,最好的做法是捕捉特定異常)

下面是測試來幫助說明:

//@Test(expected=javax.validation.ConstraintViolationException.class) 
@Test(expected=javax.ejb.EJBException.class) 
public void testCreate() throws Exception { 
    EJBContainer container = getContainer();//pull singleton container 
    AgentsFacade instance = (AgentsFacade) container.getContext().lookup("java:global/classes/AgentsFacade"); 

    Agents badAgent = new Agents(); 
    instance.create(badAgent);//null username 

    //Short username 
    Agents shortUsername = new Agents("srtnm"); 
    instance.create(shortUsername);//must be > 6 in length 
} 

這裏是相關的「用戶名」屬性的註解代理實體:

... 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(unique=true) 
@Size(min=6, max=40) 
@NotNull 
private String username; 
... 

正如你可以看到,這兩個測試應該拋出要麼javax.validation.ConstraintViolationException或一些其他異常。我可以在EJBException中的調試信息中看到它們。我不確定是否有辦法「提取」正確的例外情況?

最後,我是一個總noob。所以如果我在錯誤的道路上徒步旅行,讓我知道。

謝謝。

--Update--

針對斯蒂芬,這裏是我想出了一個結果。

try { 
     //Null username 
     Agents badAgent = new Agents(); 
     instance.create(badAgent); 
     fail("NULL agent added!");//should never reach this point. 
    } catch (EJBException e) { 
     Exception causedByException = e.getCausedByException(); 
     if(!(causedByException instanceof javax.validation.ConstraintViolationException)){ 
      fail("ConstraintViolationException wasn't thrown."); 
     } 
    } 

回答

5

你必須明確地趕在單元測試中EJBException,叫getCause()提取真正的異常,然後測試它的要求。

(這是你測試正確的例外在版本3 JUnit測試拋出的方式。)

+0

謝謝,我剛剛更新了什麼:「我認爲」的問題,你是什麼意思? – 2011-12-23 03:34:31

+0

@ AlanB.Dee - 這正是我想到的。 – 2011-12-23 04:02:56

2

您可以使用規則爲預期的異常。這件事情是這樣的:

@Rule 
public ExpectedException thrown = ExpectedException.none(); 

@Test 
public void testCreate() { 
    thrown.expect(<insert here conditions about the exception thrown>); 
    //... 
} 

我不知道這一點,但我認爲這是JUnit的4.7

+0

問題是不會拋出預期的異常。它包裝在EJBException中,必須提取才能檢查。但是,謝謝你的回答,它看起來是一個處理問題的好方法。 – 2011-12-23 03:35:51

相關問題