Java 未在JUNIT测试中创建Hibernate事务
最初,数据没有在前端发生更改时立即提交到数据库。事务从未被创建和提交,这就是为什么我将事务部分添加到代码中。它现在工作得很好,但是当我在编写事务后测试相同的方法时,测试用例的第一部分失败,抛出NPE(空指针异常),而使用相同方法的其余测试用例通过。我是春季冬眠的新手,试图理解失败背后的原因 DummyDAO.javaJava 未在JUNIT测试中创建Hibernate事务,java,spring,hibernate,junit,mockito,Java,Spring,Hibernate,Junit,Mockito,最初,数据没有在前端发生更改时立即提交到数据库。事务从未被创建和提交,这就是为什么我将事务部分添加到代码中。它现在工作得很好,但是当我在编写事务后测试相同的方法时,测试用例的第一部分失败,抛出NPE(空指针异常),而使用相同方法的其余测试用例通过。我是春季冬眠的新手,试图理解失败背后的原因 DummyDAO.java public void remove(final int roleId, final int round, final int gameId) { Prec
public void remove(final int roleId, final int round, final int gameId)
{
Preconditions.checkArgument(roleId > 0, INVALID_ROLEID);
Preconditions.checkArgument(round > 0, INVALID_ROUND);
Preconditions.checkArgument(gameId > 0, INVALID_GAMEID);
Session session = factory.openSession();
final Transaction transaction = session.beginTransaction();
try
{
Query query = session.getNamedQuery(REMOVE);
query.setParameter(ROLE_ID, roleId);
query.setParameter(ROUND, round);
query.setParameter(GAME_ID, gameId);
query.executeUpdate();
transaction.commit();
}
finally
{
session.close();
}
}
在下面提到的测试用例中,第一个测试用例在dao方法中的transaction.commit()处引发空指针异常失败。当我调试测试用例时,我看到事务有一个空值。不确定为什么未创建事务。第二个测试用例运行良好
DummyDAOTest.java
@Test
public void remove_getNamedQueryValidName_NoError()
{
final ArgumentCaptor<String> argumentCaptor = ArgumentCaptor
.forClass(String.class);
roleQuestionRoundDAO.remove(ROLE_ID_ONE, ROUND_ONE, GAME_ID_ONE);
verify(session).getNamedQuery(argumentCaptor.capture());
assertEquals(RoleQuestionRoundDAO.REMOVE, argumentCaptor.getValue());
}
@Test
public void remove_roleId_SetParameterFails()
{
doThrow(HibernateException.class).when(queryMocked).setParameter(eq("roleId"), eq(ROLE_ID_ONE));
expectedException.expect(HibernateException.class);
roleQuestionRoundDAO.remove(ROLE_ID_ONE, ROUND_ONE, GAME_ID_ONE);
}
查询:
<query name="remove">
<![CDATA[update RoleQuestionRound rq set rq.activeInd = 0 where rq.roleQuestionRoundComposite.round = :round and rq.roleQuestionRoundComposite.roleId = :roleId and rq.roleQuestionRoundComposite.gameId = :gameId]]>
</query>
如果我使用catch块捕获空指针异常,那么测试用例通过。我不知道为什么我必须捕获根本没有被抛出的异常,w.r.t其他测试用例
<query name="remove">
<![CDATA[update RoleQuestionRound rq set rq.activeInd = 0 where rq.roleQuestionRoundComposite.round = :round and rq.roleQuestionRoundComposite.roleId = :roleId and rq.roleQuestionRoundComposite.gameId = :gameId]]>
</query>