Java 未在JUNIT测试中创建Hibernate事务

Java 未在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

最初,数据没有在前端发生更改时立即提交到数据库。事务从未被创建和提交,这就是为什么我将事务部分添加到代码中。它现在工作得很好,但是当我在编写事务后测试相同的方法时,测试用例的第一部分失败,抛出NPE(空指针异常),而使用相同方法的其余测试用例通过。我是春季冬眠的新手,试图理解失败背后的原因

DummyDAO.java

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>