2017-12-25 23 views
2

처음에는 프론트 엔드 변경시 즉시 데이터베이스에 커밋되지 않았습니다. 트랜잭션이 생성되고 커밋되지 않아 트랜잭션 부분이 코드에 추가되었습니다. 지금은 잘 작동하지만, 트랜잭션 부분을 작성한 후에 동일한 메소드를 테스트 할 때 테스트 케이스 중 하나가 NPE (null 포인터 예외)를 던지지 못하고 동일한 메소드를 사용하는 나머지 테스트 케이스는 통과합니다. 저는 Spring Hibernate에서 루키 (Rookie)입니다. 실패의 원인을 이해하고자합니다.JUNIT 테스트에서 Hibernate 트랜잭션이 생성되지 않음

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에서 널 포인터 예외()을 던지는 실패한다. 테스트 케이스를 디버깅 할 때 트랜잭션에 null 값이 있음을 알 수 있습니다. 트랜잭션이 생성되지 않는 이유를 모르겠습니다. 두 번째 테스트 케이스가 잘 실행됩니다.

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

스택 트레이스 (콘솔)

java.lang.NullPointerException 
    at dummy.model.RoleQuestionRoundDAO.remove(RoleQuestionRoundDAO.java:288) 
    at dummy.model.RoleQuestionRoundDAOTest.remove_getNamedQueryValidName_NoError(RoleQuestionRoundDAOTest.java:790) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:239) 
    at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:539) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:761) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:461) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:207) 

QUERY :

<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> 

답변

1

나는 다음 테스트 케이스를 널 포인터 예외를 잡으려고 catch 블록을 사용하는 경우 통과합니다. 왜 다른 테스트 케이스에 던져지지 않는 예외를 잡아야하는지 확실하지 않습니다.