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됩니다.
대단히 감사합니다. 이유가 무엇인지 설명해 주시겠습니까? –
JMockit 1.8부터 "로컬"모의 필드가 더 이상 지원되지 않기 때문에. –