我在我的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.");
}
}
謝謝,我剛剛更新了什麼:「我認爲」的問題,你是什麼意思? – 2011-12-23 03:34:31
@ AlanB.Dee - 這正是我想到的。 – 2011-12-23 04:02:56