2014-10-22 5 views
0

jMockit을 사용하여 테스트에서 EntityManager을 조롱하려고하는데 문제가 있습니다.EntityManager jMockit을 모의 수 없습니다.

public abstract class BaseEntityManager { 

    @PersistenceContext private EntityManager entityManager; 

    protected EntityManager getEntityManager(){ 
     return entityManager; 
    } 
} 

그리고 확장하는 클래스 :

나는이 기본 클래스가 내 테스트에서

@Stateless 
public class PlayerManager extends BaseEntityManager{ 

    public Collection<PlayerDTO> getPlayersByDraftClass(int draftClass){ 
     EntityManager em = getEntityManager(); 
     Query query = em.createNamedQuery("Player.findByDraftClass", Player.class); 
     query.setParameter("draftClass", draftClass); 
     List<Player> players = query.getResultList(); 
     return convertPlayersToPlayerDTOs(players); 
    } 
    ...some other methods 
} 

을 나는이 :

public class PlayerManagerTest { 

    @Injectable EntityManager em; 
    @Tested PlayerManager pm; 

    @Test 
    public void testGetPlayersByDraftClass_PlayersReturned() throws FYPException{ 

     final List<Player> players = new ArrayList(); 
     players.add(createBasicPlayer(PLAYER_1_ID, PLAYER_1_NAME, PLAYER_1_POSITION)); 
     players.add(createBasicPlayer(PLAYER_2_ID, PLAYER_2_NAME, PLAYER_2_POSITION)); 

     new NonStrictExpectations(){ 
      @Mocked TypedQuery playerQuery; 
      { 
       em.createNamedQuery(anyString, Player.class); 
       result = playerQuery; 

       playerQuery.getResultList(); 
       result = players; 
      } 
     }; 

     final ArrayList<PlayerDTO> result = (ArrayList<PlayerDTO>)pm.getPlayersByDraftClass(TEST_YEAR); 

     new Verifications(){{ 
      assertNotNull("The list of players should not be null", result); 
      assertFalse("The list should not be empty", result.isEmpty()); 
      assertEquals("The number of dtos returned should match the query result", players.size(), result.size()); 
      assertDTOsMatchEntities(players, result); 
     }}; 

    } 
    ...some other tests and helper methods 
} 

내가 널 포인터를 얻고을 예외 라인에 playerQuery.getResultList(), 그래서 나는 playerQuery regi되지 않습니다 초기화되고 있다고 가정합니다 지금까지와 마찬가지로 em.createNamedQuery(anyString, Player.class)을 스테이징합니다.

심지어 PlayerManager 클래스로 EntityManager를 이동하려고 시도했기 때문에 getEntityManager()을 호출 할 필요가 없지만 여전히 동일한 null 포인터가 throw됩니다.

답변

2

@Mocked TypedQuery playerQuery 로컬 필드를 mock 매개 변수로 테스트 메소드로 이동하십시오.

+1

대단히 감사합니다. 이유가 무엇인지 설명해 주시겠습니까? –

+0

JMockit 1.8부터 "로컬"모의 필드가 더 이상 지원되지 않기 때문에. –

관련 문제