【问题标题】:Can't mock EntityManager jMockit无法模拟 EntityManager jMockit
【发布时间】:2014-12-17 23:51:38
【问题描述】:

我在尝试使用 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
}

在我的测试中我有:

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 从未被初始化,因为它没有像以往一样注册 em.createNamedQuery(anyString, Player.class)

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

【问题讨论】:

    标签: java unit-testing jpa junit jmockit


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,您能解释一下为什么会这样吗?
    • 因为自 JMockit 1.8 起不再支持“本地”模拟字段。
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多