java - 测试 IllegalArgumentException 未按预期捕获

标签 java exception junit illegalargumentexception

我有以下测试代码:

@Test(expected = IllegalArgumentException.class)
public void addPlayerFailureTest()    {
    playerDAO.addPlayer(null);
}

此代码应该返回一个 IllegalArgumentException,并且按预期返回。但是,它将测试变为红色。这是堆栈跟踪:

ERROR  addPlayer, Player failure: 
java.lang.IllegalArgumentException: attempt to create merge event with null entity
    at org.hibernate.event.MergeEvent.<init>(MergeEvent.java:60)
    at org.hibernate.event.MergeEvent.<init>(MergeEvent.java:43)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:688)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:692)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:235)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
    at com.sun.proxy.$Proxy32.merge(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
    at com.sun.proxy.$Proxy32.merge(Unknown Source)
    at fr.game.core.dao.AbstractJpaGenericDAO.update(AbstractJpaGenericDAO.java:58)
    at fr.game.core.dao.player.JPAJoueurDAO.addJoueur(JPAJoueurDAO.java:40)
    at fr.game.core.dao.player.JoueurDAOTest.addJoueurFailureTest(JoueurDAOTest.java:23)

我应该收到这个异常,但我不能。在 Enum 中测试错误值时,我遇到了同样的行为。

为什么它让我的测试失败?是因为异常是从这样一个地方抛出的,它不能被捕获吗?

编辑

addPlayer() 方法:

public boolean addPlayer(Player player) {
    try {
        update(player);
        return true;
    } catch (Exception e) {
        log.error("Player failure : ", e);
        return false;
    }
}

它之前会被检测到(因为在这种情况下我们不会到达return false),但我正在从以前的开发人员那里收回一些旧代码,因此为这个特殊用途编写测试用例案例。

最佳答案

您在 addPlayer() 方法中捕获了 IllegalArgumentException(它是 Exception 的子类型)。它永远不会达到测试方法。 您看到的不是测试方法抛出的实际异常,而是 log.error("Player failure : ", e); 的控制台输出。

关于java - 测试 IllegalArgumentException 未按预期捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47795349/

相关文章:

java - 如何在java中将文件读入字符串?

以微秒为单位的 Java utc 时间和以 15 微秒为单位的 block

ruby-on-rails - 可以在 Rails Controller 中渲染并引发异常吗?

c++ - 哪个 vector 引发索引超出范围异常?

unit-testing - 在哪里可以找到 EJB 和 J2EE 的良好单元测试资源?

java - 我可以强制 Junit 调试器使用 Eclipse IDE 通过自定义测试用例方法开始调试执行吗?

java - 为什么我不能调试 Proxy.newProxyInstance 方法?

java - 在 groovy 中定义带有类型的变量

c++ - 在对象的析构函数被调用后使用对象

java - 尝试使用 SAX 解析 XML,但我的 JUnit 测试都不起作用?