java - 使用 EJBContainer 时如何在 jUnit 中获取 "real"异常而不是 EJBException?

标签 java jakarta-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 实体的“用户名”属性的注释:

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

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

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

谢谢。

--更新--

作为对 Stephen 的回应,这是我得出的结果。

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

最佳答案

您必须在单元测试中显式捕获 EJBException,调用 getCause() 提取真正的异常,然后根据需要对其进行测试。

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

关于java - 使用 EJBContainer 时如何在 jUnit 中获取 "real"异常而不是 EJBException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611634/

相关文章:

java - Android Viewpager 为空

Java uploader ( Jersey )使所有服务中断

java - Spring 和 Hibernate 配置错误无法从 URL 位置导入 bean 定义

java - 让 DbUnit 与 Hibernate 事务一起工作

java - Prime 测试,2 位数字

java - JavaCC 生成的代码中出现 NoClassDefFoundError

java - 从尺寸中删除魔数(Magic Number)

java - 正确使用 LabelValueBean

java - 为什么我会收到 "createCriteria is not valid without active transaction"异常?

java - 为什么我的 Testcontainers 测试会挂起直到 "Waiting for database connection to become available at"超时?