Java Can';t mock EntityManager jMockit

Java Can';t mock EntityManager jMockit,java,unit-testing,jpa,junit,jmockit,Java,Unit Testing,Jpa,Junit,Jmockit,我在使用jMockit模拟测试中的EntityManager时遇到了一些问题 我有一个基本类: public abstract class BaseEntityManager { @PersistenceContext private EntityManager entityManager; protected EntityManager getEntityManager(){ return entityManager; } } 以及一个扩展它的类

我在使用jMockit模拟测试中的
EntityManager
时遇到了一些问题

我有一个基本类:

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
}
@无状态
公共类PlayerManager扩展BaseEntityManager{
公共集合getPlayersByDraftClass(int draftClass){
EntityManager em=getEntityManager();
Query Query=em.createNamedQuery(“Player.findByDraftClass”,Player.class);
query.setParameter(“draftClass”,draftClass);
List players=query.getResultList();
返回转换器playerstoplayerdtos(玩家);
}
…其他一些方法
}
在我的测试中,我有:

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
}
公共类PlayerManagerTest{
@注射型全自动管理器;
@测试游戏管理员pm;
@试验
public void testGetPlayersByDraftClass_PlayersReturned()抛出FYPException{
最终玩家名单=新ArrayList();
添加(CreateBasicLayer(玩家ID、玩家名称、玩家位置));
添加(CreateBasicLayer(玩家ID、玩家姓名、玩家位置));
新的非严格测量(){
@模拟类型查询playerQuery;
{   
em.createNamedQuery(anyString,Player.class);
结果=playerQuery;
playerQuery.getResultList();
结果=运动员;
}
};
最终ArrayList结果=(ArrayList)pm.getPlayersByDraftClass(测试年);
新的核查(){{
assertNotNull(“参与者列表不应为空”,结果);
assertFalse(“列表不应为空”,result.isEmpty());
assertEquals(“返回的DTO数量应与查询结果相匹配”,players.size(),result.size());
资产匹配实体(玩家、结果);
}};
}
…其他一些测试和辅助方法
}
我在
playerQuery.getResultList()
行上得到一个空指针异常,因此我假设
playerQuery
从未被初始化,因为它没有注册
em.createNamedQuery(anyString,Player.class)


我甚至尝试过将EntityManager移动到PlayerManager类中,因此不再需要调用
getEntityManager()
,但它仍然抛出相同的空指针。

@mock TypedQuery playerQuery
本地字段作为模拟参数移动到测试方法中。

非常感谢,您能解释一下为什么这样做吗?因为自从JMockit 1.8以来,“本地”模拟字段不再受支持。