嘲笑EntityManager在测试EJB类时



我正在使用:Netbeans,Glassfish,Mockito

第一次与Java EE合作时,我遇到了尝试使用EntityManager进行与数据库进行交互的方法的问题。

在以下代码段中,我试图嘲笑实体管理器,因此我知道DB交互不会精确测试,并且对于此测试,则可以。但是我正在插入UsersController,因为它具有始终是null的注射EntityManager。我希望嘲笑EntityManager,以便我可以测试其余方法。

下面是与DB相互作用的类。请注意,这是一种示例方法,它不适用于生产。

@Stateless
public class UsersController {
    @PersistenceContext()
    EntityManager em;
    public User getOne() {
        em.getEntityManagerFactory().getCache().evictAll();
        User theUser = null;
        try {
            Query q = em.createNamedQuery("User.findAll");
            Collection<User> entities = q.getResultList();
            theUser = Iterables.get(entities, 1);
        }
        catch(NoResultException e){}
        em.flush();
        return theUser;
    };
}

将测试此方法的测试文件。

@RunWith(MockitoJUnitRunner.class)
public class UsersControllerTest {
    @Mock
    private UsersController usersController;
    @Mock
    private EntityManager entityManagerMock;
    private Collection<User> mockUsersDbCollection = //...
    @BeforeClass
    public void setUpClass() {
        when(entityManagerMock.createNamedQuery("User.findAll")).thenReturn(mockUsersDbCollection);
    }
    @Test
    public void findOneTest(){
        User mockUserDbEntry = new User("1", "pa$$word", "salt", "user1", "user1@email.com", false);
        User returnedUser = null;
        returnedUser = usersController.getOne();
        assertEquals(returnedUser.getId(), "1");
    }
}

每当创建UsersController模拟时,EntityManager始终导致问题,我如何注入EntityManagerMock,以便它可以工作?

您在这里有一些问题:

  • 您正在测试您的UsersController,因此不应嘲笑它;相反,您应该在上面使用@InjectMocks注释,因为您希望Mockito注入Mock Entity Manager

  • @BeforeClass注释仅在应用于静态方法时起作用,而静态方法只能访问静态实例变量;在这种情况下,我认为您只需要@Before注释

  • 您的entityManagerMock.createNamedQuery需要返回模拟Query对象,您粘贴的代码甚至不应编译

最后,您的测试应该看起来像:

@RunWith(MockitoJUnitRunner.class)
public class UsersControllerTest {
    @InjectMocks
    private UsersController usersController;
    @Mock
    private EntityManager entityManagerMock;
    @Mock
    private EntityManagerFactory entityManagerFactory;
    @Mock
    private Cache emfCache;
    @Mock
    private Query findAllQuery;
    private List<User> mockUsersDbCollection = //...
    @Before
    public void setUp() {
        when(entityManagerFactory.getCache())
            .thenReturn(emfCache);
        when(entityManagerMock.getEntityManagerFactory())
            .thenReturn(entityManagerFactory);
        when(entityManagerMock.createNamedQuery("User.findAll"))
            .thenReturn(findAllQuery);
        when(findAllQuery.getResultList())
            .thenReturn(mockUsersDbCollection);
    }
    @Test
    public void findOneTest(){
        mockUsersDbCollection.add(new User("1", "pa$$word", "salt", "user1", "user1@email.com", false));
        User returnedUser = usersController.getOne();
        assertEquals(returnedUser.getId(), "1");
    }
}

相关内容

  • 没有找到相关文章

最新更新