我正在使用: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");
}
}