测试 IllegalArgumentException 未按预期捕获
Testing IllegalArgumentException is not catching as expected
我有以下测试代码:
@Test(expected = IllegalArgumentException.class)
public void addPlayerFailureTest() {
playerDAO.addPlayer(null);
}
此代码应该 return 和 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);
.
的控制台输出
我有以下测试代码:
@Test(expected = IllegalArgumentException.class)
public void addPlayerFailureTest() {
playerDAO.addPlayer(null);
}
此代码应该 return 和 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);
.