使用EJBContainer时如何在jUnit中获取“真实”异常而不是EJBException?

时间:2011-12-23 02:19:21

标签: java java-ee junit glassfish

我正在Java EE应用程序中设置单元测试。我正在使用JPA,JSF,Netbeans和Glassfish。这也是我的第一个真正的java应用程序,请原谅我,如果答案是明显的愚蠢!

测试使用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
}

以下是Agents实体的“username”属性的注释:

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

如您所见,两个测试都应抛出javax.validation.ConstraintViolationException或其他一些异常。我可以在EJBException中的调试信息中看到它们。我不确定是否有办法“提取”正确的例外情况?

最后,我是一个总菜鸟。因此,如果我走错了路,请告诉我。

感谢。

- 更新 -

回应斯蒂芬,这是我提出的结果。

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.");
        }
    }

2 个答案:

答案 0 :(得分:5)

您必须在单元测试中明确捕获EJBException,调用getCause()以提取真实异常,然后根据需要进行测试。

(这是测试在版本3 JUnit测试中抛出正确异常的方法。)

答案 1 :(得分:2)

您可以使用规则来处理预期的异常。它是这样的:

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

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

我不确定这一点,但我认为这适用于JUnit 4.7